1. 程式人生 > >unity3d完成VR手柄第一人稱射擊小遊戲(純程式碼)

unity3d完成VR手柄第一人稱射擊小遊戲(純程式碼)

using UnityEngine;
using UnityEngine.AI;
/// <summary>
/// 敵人向玩家移動 並自動尋路  路途中播放自帶動畫 完成 攻擊兩次 敵人死亡
/// 以下程式碼負責動畫播放
/// </summary>
public class WolfControl : MonoBehaviour
{
    Transform Hero;    //主角的位置 狼目標
    public int iTakeDamage = 0;    //受到第幾次傷害
    bool isTakeDamage = false;    //false代表是少於兩次傷害
    NavMeshAgent agent;    //自動尋路
Animation ani; //申請動畫物件 int count = 0; //計數器 // Use this for initialization void Start() { Hero = GameObject.Find("[CameraRig]").transform; //找到玩家的位置 agent = GetComponent<NavMeshAgent>(); //獲得尋路元件 ani = GetComponent<Animation>(); //獲得動畫 } // Update is called once per frame
void Update() { wolfMove(); //執行事件 } void wolfMove() { float dist = Vector3.Distance(transform.position, Hero.position); //計算與玩家的距離 if (dist > 20) //如果大於20就執行命令 { if (iTakeDamage != 2) //如果傷害數少於2的時候 { agent.destination = Hero.position; //尋路到玩家的位置
} if (iTakeDamage == 0) //如果沒有受到過傷害 或者是隻受到一次傷害 { ani.Play("Wolf-Walk"); //執行動畫 } else if (iTakeDamage == 1 && isTakeDamage == false) //如果受到一次傷害且沒有死亡的時候 { count++; //計數 ani.Play("Wolf-Damage1"); //播放傷害動畫 if (count > 10) //如果計數大於10 { isTakeDamage = true; //改變標記 代表已經收到過一次傷害 iTakeDamage = 0; //改變標誌 } else if (iTakeDamage == 2) //受到2次傷害 { ani.Play("Wolf-Death"); //播放死亡動畫 Destroy(gameObject, 2); //2秒後消失 } } } else if (dist <= 20) //如果距離玩家小於20 { if (iTakeDamage == 0) { ani.Play("Wolf-Attack1");//執行動畫 } else if (iTakeDamage == 1 && isTakeDamage == false) //如果受到一次傷害且沒有死亡的時候 { count++; //計數 ani.Play("Wolf-Damage1"); //播放傷害動畫 if (count > 10) //如果計數大於10 { isTakeDamage = true; //改變標記 代表已經收到過一次傷害 iTakeDamage = 0; //改變標誌 } else if (iTakeDamage == 2) //受到2次傷害 { ani.Play("Wolf-Death"); //播放死亡動畫 Destroy(gameObject, 2); //2秒後消失 } } } } }
using UnityEngine;
/// <summary>
/// 以下程式碼負責生成子彈
/// </summary>
public class AK_47Shoot : MonoBehaviour
{

    public GameObject bullet;    //公開一個子彈模型用於拖拽
    public Transform pos;    //公開一個子彈生成位置用於拖拽
    SteamVR_TrackedController stc;    //申請一個VR扳機扣動物件
    // Use this for initialization
    void Start()
    {
        stc = GetComponent<SteamVR_TrackedController>();    //獲得VR手柄扳機元件
        stc.TriggerUnclicked += OnTriggerUnclicked;    //給扳機動作增加事件
    }

    // Update is called once per frame
    void Update()
    {

    }
    void OnTriggerUnclicked(object sender, ClickedEventArgs e)     //扳機扣動事件
    {
        GameObject obj = Instantiate(bullet, pos.position, pos.rotation);    //動態生成一個子彈模組
        Rigidbody r = obj.GetComponent<Rigidbody>();    //獲得子彈模組的剛體元件
        r.velocity = -pos.forward * 30;    //給子彈模組一個速度(velocity)
        Destroy(obj, 2);    //2秒後銷燬子彈模組
    }
}
using UnityEngine;
/// <summary>
/// 以下程式碼綁在子彈上,負責子彈碰撞狼後的反應
/// </summary>
public class OnCliiton : MonoBehaviour {

    int count = 0;    //計數器
    void Start()
    {

    }
    void OncollisionEnter(Collision orther)
    {
        if (orther.gameObject.name.Equals("WolfNormal(Clone)"))      //檢測是否碰到的是不是狼
        {
            count++;    //計數
            if(count >2)    //如果碰撞2次以上
            {
                return;    //返回
            }
            //播放受到傷害的動畫
            WolfControl move = orther.gameObject.GetComponent<WolfControl>();    //獲得動畫播放的指令碼
            if (move !=null)    //如果元件不是空
            {
                move.iTakeDamage = count;   //將狼被擊中的次數傳出  
            }
        }

    }

}