VR開發(fā)實戰(zhàn)HTC Vive項目之一起打鬼子

一击蹲、游戲場景

二署拟、創(chuàng)建怪物


CreateMonster

using UnityEngine;
using System.Collections;

public class CreateMonster : MonoBehaviour {
    //產(chǎn)生的怪物預制體
    public GameObject Monster;
    //目標位置
    public Transform TargetPositon;
    //創(chuàng)建時播放的聲音文件
    public AudioClip CreateClip;
    AudioSource AudioSource;
    //最長刷怪時長
    float MaxColdDownTime = 10;
    //最短帥怪時長
    float MinColdDownTime = 4;
    float CurrentColdDownTime;

    void Start()
    {
        //初始化下次刷怪事件
        CurrentColdDownTime = MinColdDownTime;
        //獲取AudioSource屬性
        AudioSource = GetComponent<AudioSource>();
    }
    // Update is called once per frame
    void Update () {
        //通過Time.deltaTime來獲取每一幀執(zhí)行的時間
        CurrentColdDownTime -= Time.deltaTime;
        //當冷卻時間完成后創(chuàng)建怪物并減少刷怪冷卻時間
        if (CurrentColdDownTime <= 0)
        {
            InstantiateMonster();
            CurrentColdDownTime = MaxColdDownTime;
            if (MaxColdDownTime > MinColdDownTime)
            {
                MaxColdDownTime -= 0.5f;
            }
        }
    }

    void InstantiateMonster()
    {
        //播放怪物吼叫聲音
        AudioSource.PlayOneShot(CreateClip);
        //根據(jù)預制體創(chuàng)建怪物
        GameObject go = Instantiate(Monster);
        //將創(chuàng)建出來的怪物放置到自己下面,方便管理
        go.transform.parent = this.transform;
        //通過Random類隨機放置怪物在傳送門口
        go.transform.position = this.transform.position + new Vector3(Random.Range(-5, 5), 0, Random.Range(-2.5f, 2.5f));
        go.GetComponent<EnermyController>().TargetTransform = TargetPositon;
    }
}

三歌豺、給怪物添加自動尋路

四芯丧、給怪物添加動畫

五、怪物行為控制

using UnityEngine;
using System.Collections;

public class EnermyController : MonoBehaviour {
    //目標位置
    public Transform TargetTransform;
    //總血量
    int HP = 2;
    //導航組件
    UnityEngine.AI.NavMeshAgent NavMeshAgent;
    //動畫組件
    Animator Animator;

    // Use this for initialization
    void Start () {
        //初始化變量
        NavMeshAgent = GetComponent<UnityEngine.AI.NavMeshAgent>();
        NavMeshAgent.SetDestination(TargetTransform.transform.position);
        Animator = GetComponent<Animator>();
    }
    
    // Update is called once per frame
    void Update () {
        //死亡直接返回
        if (HP <= 0)
        {
            return;
        }
        //獲取當前動畫信息
        AnimatorStateInfo stateInfo = Animator.GetCurrentAnimatorStateInfo(0);

        //判斷當前的動畫狀態(tài)是什么世曾,并進行對應(yīng)的處理
        if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Run") && !Animator.IsInTransition(0))
        {
            Animator.SetBool("Run", false);
            //玩家有移動重新檢測缨恒,目前不會移動
            if (Vector3.Distance(TargetTransform.transform.position, NavMeshAgent.destination) > 1)
            {
                NavMeshAgent.SetDestination(TargetTransform.transform.position);
            }
            //進入攻擊距離跳轉(zhuǎn)到攻擊動畫,否則繼續(xù)跑動
            if (NavMeshAgent.remainingDistance < 3)
            {
                Animator.SetBool("Attack",true);
            }
            else
            {
                Animator.SetBool("Run", true);
            }
        }

        if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Attack") && !Animator.IsInTransition(0))
        {
            Animator.SetBool("Attack", false);
            //玩家有移動重新檢測轮听,目前不會移動
            if (Vector3.Distance(TargetTransform.transform.position, NavMeshAgent.destination) > 1)
            {
                NavMeshAgent.SetDestination(TargetTransform.transform.position);
            }
            //進入攻擊距離跳轉(zhuǎn)到攻擊動畫骗露,否則繼續(xù)跑動
            if (NavMeshAgent.remainingDistance < 3)
            {
                Animator.SetBool("Attack", true);
                NavMeshAgent.Stop();
            }
            else
            {
                Animator.SetBool("Run", true);
            }

            //if (stateInfo.normalizedTime >= 1.0f)
            //{
            //    Manager.Instance.UnderAttack();
            //}
        }

        if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Damage") && !Animator.IsInTransition(0))
        {
            Animator.SetBool("Attack", false);
            Animator.SetBool("Run", false);
            //玩家有移動重新檢測,目前不會移動
            if (Vector3.Distance(TargetTransform.transform.position, NavMeshAgent.destination) > 1)
            {
                NavMeshAgent.SetDestination(TargetTransform.transform.position);
            }
            //進入攻擊距離跳轉(zhuǎn)到攻擊動畫血巍,否則繼續(xù)跑動
            if (NavMeshAgent.remainingDistance < 3)
            {
                Animator.SetBool("Attack", true);
                NavMeshAgent.Stop();
            }
            else
            {
                Animator.SetBool("Run", true);
            }
        }
    }

    //當被槍擊中時調(diào)用
    public void UnderAttack()
    {
        //扣血并判斷是否死亡萧锉,如果死亡則直接跳到死亡動畫,否則跳到受傷動畫
        HP--;
        if (HP <= 0)
        {
            Animator.Play("Death");
            Destroy(GetComponent<Collider>());
            Destroy(GetComponent<UnityEngine.AI.NavMeshAgent>());
        }
        else
        {
            Animator.Play("Damage");
        }
    }

    //怪物攻擊由動畫事件調(diào)用
    public void Attack()
    {
        Manager.Instance.UnderAttack();
    }
}

六述寡、游戲管理類

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class Manager : MonoBehaviour {
    //Manager單例
    public static Manager Instance;
    //當前玩家HP
    public int CurrentHP = 10;
    //添加傳送門和重玩引用
    public GameObject Portals;
    public GameObject Replay;
    // Use this for initialization
    void Awake () {
        //實現(xiàn)單例
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Debug.LogError("僅有一個Manager");
        }
    }
    
    //收到怪物攻擊
    public void UnderAttack () {
        CurrentHP--;
        //如果血量小于0游戲失敗
        if(CurrentHP < 0)
        {
            EndGame();
        }
    }

    void EndGame()
    {
        Destroy(Portals);
        Replay.SetActive(true);
    }

    //重新開始游戲
    public void ReStartGame()
    {
        SceneManager.LoadScene("FPS");
        //Application.LoadLevel("FPS");
    }
}

七柿隙、怪物攻擊

八、主角攻擊

1鲫凶、添加手槍模型
2禀崖、剩余子彈
3、添加開槍動畫
4螟炫、實現(xiàn)開槍邏輯
using UnityEngine;
using System.Collections;

public class GunShoot : MonoBehaviour {
    //添加引用
    public Animator Animator;
    public Transform GunPoint;
    public GameObject Spark;
    public TextMesh textMesh;
    public AudioClip Fire;
    public AudioClip Reload;
    AudioSource AudioSource;
    bool isReloading = false;
    int maxBullet = 12;
    int currnetBullet;
    SteamVR_TrackedController SteamVR_TrackedController;

    // Use this for initialization
    void Start () {
        //創(chuàng)建監(jiān)聽
        SteamVR_TrackedController = GetComponent<SteamVR_TrackedController>();
        SteamVR_TrackedController.TriggerClicked += TriggerClicked;
        SteamVR_TrackedController.Gripped += Gripped;
        currnetBullet = maxBullet;
        AudioSource = GetComponent<AudioSource>();

    }
    
    //扳機扣下時的開槍邏輯
    void TriggerClicked(object sender, ClickedEventArgs e)
    {
        //如果在換彈中直接返回
        if (isReloading)
        {
            return;
        }
        //如果沒有子彈也直接返回
        if (currnetBullet > 0)
        {
            currnetBullet --;
            textMesh.text = currnetBullet.ToString();
        }
        else
        {
            return;
        }
        //播放開槍聲音
        AudioSource.PlayOneShot(Fire);
        Animator.Play("PistolAnimation");
        Debug.DrawRay(GunPoint.position, GunPoint.up*100, Color.red, 0.02f);
        Ray raycast = new Ray(GunPoint.position, GunPoint.up);
        RaycastHit hit;
        //根據(jù)Layer來判斷是否有物體擊中
        LayerMask layer = 1<<( LayerMask.NameToLayer("Enermy"));
        bool bHit = Physics.Raycast(raycast, out hit,10000,layer.value);
        //擊中扣血邏輯
        if (bHit)
        {
            Debug.Log(hit.collider.gameObject);
            EnermyController ec = hit.collider.gameObject.GetComponent<EnermyController>();
            if (ec != null)
            {
                ec.UnderAttack();
                GameObject go = GameObject.Instantiate(Spark);
                go.transform.position = hit.point;
                Destroy(go, 3);
            }
            else
            {
                Manager.Instance.ReStartGame();
            }
        }
    }

    //手柄握下的邏輯
    void Gripped(object sender, ClickedEventArgs e)
    {
        if (isReloading)
        {
            return;
        }
        isReloading = true;
        Invoke("ReloadFinished", 2);
        AudioSource.PlayOneShot(Reload);
    }

    //換彈結(jié)束
    void ReloadFinished()
    {
        isReloading = false;
        currnetBullet = maxBullet;
        textMesh.text = currnetBullet.ToString();
    }
}

5波附、設(shè)置怪物層級

九、游戲重新開始


Paste_Image.png

十昼钻、添加背景音樂和音量調(diào)整

十一掸屡、效果展示

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市然评,隨后出現(xiàn)的幾起案子仅财,更是在濱河造成了極大的恐慌,老刑警劉巖碗淌,帶你破解...
    沈念sama閱讀 221,273評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盏求,死亡現(xiàn)場離奇詭異,居然都是意外死亡贯莺,警方通過查閱死者的電腦和手機风喇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕探,“玉大人魂莫,你說我怎么就攤上這事〉模” “怎么了耙考?”我有些...
    開封第一講書人閱讀 167,709評論 0 360
  • 文/不壞的土叔 我叫張陵谜喊,是天一觀的道長。 經(jīng)常有香客問我倦始,道長斗遏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評論 1 296
  • 正文 為了忘掉前任鞋邑,我火速辦了婚禮诵次,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枚碗。我一直安慰自己逾一,他們只是感情好,可當我...
    茶點故事閱讀 68,515評論 6 397
  • 文/花漫 我一把揭開白布肮雨。 她就那樣靜靜地躺著遵堵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怨规。 梳的紋絲不亂的頭發(fā)上陌宿,一...
    開封第一講書人閱讀 52,158評論 1 308
  • 那天,我揣著相機與錄音波丰,去河邊找鬼壳坪。 笑死,一個胖子當著我的面吹牛呀舔,可吹牛的內(nèi)容都是我干的弥虐。 我是一名探鬼主播扩灯,決...
    沈念sama閱讀 40,755評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼媚赖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了珠插?” 一聲冷哼從身側(cè)響起惧磺,我...
    開封第一講書人閱讀 39,660評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捻撑,沒想到半個月后磨隘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,203評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡顾患,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,287評論 3 340
  • 正文 我和宋清朗相戀三年番捂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片江解。...
    茶點故事閱讀 40,427評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡设预,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出犁河,到底是詐尸還是另有隱情鳖枕,我是刑警寧澤魄梯,帶...
    沈念sama閱讀 36,122評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站宾符,受9級特大地震影響酿秸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜魏烫,卻給世界環(huán)境...
    茶點故事閱讀 41,801評論 3 333
  • 文/蒙蒙 一辣苏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧哄褒,春花似錦考润、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至罚舱,卻和暖如春井辜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背管闷。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評論 1 272
  • 我被黑心中介騙來泰國打工粥脚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人包个。 一個月前我還...
    沈念sama閱讀 48,808評論 3 376
  • 正文 我出身青樓刷允,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碧囊。 傳聞我的和親對象是個殘疾皇子树灶,可洞房花燭夜當晚...
    茶點故事閱讀 45,440評論 2 359

推薦閱讀更多精彩內(nèi)容