unity3d完成VR手柄第一人稱射擊小遊戲(純程式碼)
阿新 • • 發佈:2019-01-09
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; //將狼被擊中的次數傳出
}
}
}
}