unity3D 第一人稱簡單射擊示例
阿新 • • 發佈:2019-01-05
參考: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 () { } }