unity3d完成VR手柄第一人称射击小游戏(纯代码)

xiaoxiao2021-02-27  363

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; //将狼被击中的次数传出 } } } }
转载请注明原文地址: https://www.6miu.com/read-5675.html

最新回复(0)