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;   //將狼被擊中的次數傳出  
            }
        }

    }

}
發佈了29 篇原創文章 · 獲贊 10 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章