1. 程式人生 > >unity3D 第一人稱簡單射擊示例

unity3D 第一人稱簡單射擊示例

參考:unity5實戰第三章,慢慢學習

放兩個東西

一個是玩家,主攝像機附在上面,配上Mouselook.cs,FPSInput.cs使其能響應鍵盤移動跟滑鼠移動

Mouselook.cs,FPSInput.cs的實現前面有

一個是敵人,附上Reactive.cs受擊反饋指令碼,實現在下面

現在要做的是:按下左鍵,射出子彈,被射中區域顯示球(子彈),被射中的敵人受擊反饋消失

現在給玩家的主攝像機配上rayshoot.cs ,攝像機可以射出射線。

rayshoot.cs編寫思路:

0.OnGUI()寫個準星

1.響應左鍵,使用carema的API在攝像機位置產生射線

2.如果射中了(不一定是敵人)

    A.射中敵人,命令敵人呼叫受擊反饋函式,敵人1s後消失

    B.射中別的,產生(子彈)小球附上射中的點上,子彈1s後消失

            由於需要延時消失,用協程來實現

實現如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class RayShooter : MonoBehaviour {
    private Camera _camera;
	// Use this for initialization
	void Start () {
        _camera = GetComponent<Camera>();
	}
	void OnGUI()
    {
        int size = 12;
        float posX = _camera.pixelWidth / 2 - size / 4;
        float posY = _camera.pixelHeight / 2 - size / 2;
        GUI.Label(new Rect(posX, posY, size, size), "*");
    }
	// Update is called once per frame
	void Update () {
        //響應左鍵
        if (Input.GetMouseButton(0)==true) {
            Vector3 point = new Vector3(_camera.pixelWidth / 2, _camera.pixelHeight/2, 0);
            Ray ray=_camera.ScreenPointToRay(point);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit))//hit就是被擊中的目標
            {
                // Debug.Log(point);
                //獲取打到的物體
                GameObject hitobj = hit.transform.gameObject;
                ReactiveTarget RT = hitobj.GetComponent<ReactiveTarget>();
                if (RT != null){
                    RT.Reacttohit();//呼叫敵人的被擊反饋
                }
                else{
                    StartCoroutine(F(hit.point));//用協程造子彈,因為要編寫子彈要1s後消失的效果
                }
            }
        }
	}
    private IEnumerator F(Vector3 pos)//協程
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
        sphere.transform.position = pos;
        yield return new WaitForSeconds(1);
        Destroy(sphere);//1s後消失
    }
}

 敵人需要受擊反饋,1.5s後消失,使用協程,ReactiveTarget.cs如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ReactiveTarget : MonoBehaviour {
    public void Reacttohit()
    {
        StartCoroutine(Die());
    }
    private IEnumerator Die()
    {
        this.transform.Rotate(-75, 0, 0);
        yield return new WaitForSeconds(1.5f);
        Destroy(this.gameObject);
    }
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}