Unity3D開(kāi)發(fā)實(shí)戰(zhàn)之坦克大戰(zhàn)

框架視圖

坦克大戰(zhàn)

關(guān)鍵代碼

GameStart

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
public class GameStart : MonoBehaviour {
    void Update () {

        if (Input.GetMouseButtonDown(0))
        {
            SceneManager.LoadScene(1);
        }
    }
}

TankMovement

public class TankMovement : MonoBehaviour {


    //定義一個(gè)移動(dòng)速度;
    public float speed = 5;

    //定義一個(gè)旋轉(zhuǎn)的速度
    public float angularSpeed = 5;
        

    //定義一個(gè)剛體的變量
    private Rigidbody m_Rigidbody;


    //增加坦克的編號(hào) 或者控制不同的軸
    public float number = 2; //增加坦克的編號(hào)纷铣,通過(guò)編號(hào)進(jìn)行不同的控制;


    //聲明坦克停止和駕駛的兩個(gè)狀態(tài)的聲音變量;
    public AudioClip idleAudio;
    public AudioClip drivingAudio;


    //獲取聲音源的組件 用來(lái)判斷坦克是播放那種音效而用的
    private AudioSource audio;

    void Start () {
    
        //獲取剛體組件
        m_Rigidbody=gameObject.GetComponent<Rigidbody>();


        //獲取聲音源組件利赋;
        audio=gameObject.GetComponent<AudioSource>();

    }
    
    //物理位移一般都定義在FixedUpdate中郁妈;
    void FixedUpdate() {

    //    //第一種控制坦克移動(dòng)你的方法;
    //    if (Input.GetKey(KeyCode.A))
    //    {
    //        m_Rigidbody.AddForce(Vector3.left*speed,ForceMode.Force);
    //    }
    //    if (Input.GetKey(KeyCode.D))
    //    {
    //        m_Rigidbody.AddForce(Vector3.right*speed,ForceMode.Force);
    //    }

    //    if (Input.GetKey(KeyCode.W))
    //    {
    //        m_Rigidbody.AddForce(Vector3.forward*speed,ForceMode.Force);
    //    }
    //    if (Input.GetKey(KeyCode.S))
    //    {
    //        m_Rigidbody.AddForce(Vector3.back*speed,ForceMode.Force);
    //    }
    
        //第二種控制坦克移動(dòng)的方法
        //垂直方向
        float v = Input.GetAxis("VerticalPlayer"+number);
        
        //給剛體加一個(gè)速度趾断;
        m_Rigidbody.velocity = gameObject.transform.forward*v*speed;

        //水平方向
       //float h = Input.GetAxis("Horizontal");
      // m_Rigidbody.velocity = gameObject.transform.right*h*speed;

        //水平旋轉(zhuǎn)
        float h = Input.GetAxis("HorizontalPlayer"+number);
        //給水平方向加一個(gè)旋轉(zhuǎn)速度
        m_Rigidbody.angularVelocity = gameObject.transform.up*h*angularSpeed;



        //判斷是播放閑置狀態(tài)還是駕駛狀態(tài) 聲音源
        if (Mathf.Abs(h) > 0 || Mathf.Abs(v) > 0) //判斷是否有按下鍵 數(shù)學(xué)絕對(duì)值拒名;
        {
            audio.clip = drivingAudio;//切記是:audio.clip
            if (audio.isPlaying == false)
            {
                audio.Play();
            }
           
        }
        else {

            audio.clip = idleAudio;
            if (audio.isPlaying == false)
            {
                audio.Play();
            }
        }


        //if (audio.isPlaying == false)
        //{
        //    audio.Play();
        //}
 
    }
}

DestoryForTime

public class DestoryForTime : MonoBehaviour {

    //一段時(shí)間后銷(xiāo)毀爆炸效果
    //定義一個(gè)時(shí)間
    public float time;
    void Start () { 
        //一開(kāi)始或者說(shuō)一生成就調(diào)用銷(xiāo)毀的方法;
        GameObject.Destroy(this.gameObject,time);
    }

}

FllowTarget


public class FllowTarget : MonoBehaviour {

    //聲明兩個(gè)把物體的位置變量 用來(lái)計(jì)算兩個(gè)位置的偏移值
    public Transform player1;
    public Transform player2;
    //聲明一個(gè)偏移值的變量芋酌;
    Vector3 offset;
    //聲明相機(jī)的類(lèi)型變量增显。為了獲取size大小;
    private Camera camera;
    void Start () { 
        //計(jì)算偏移值同云;
        offset = transform.position - (player1.position + player2.position) / 2;
        //給相機(jī)組件賦值糖权;
        camera=gameObject.GetComponent<Camera>();
    }       
    void Update () {

        if (player1!=null&&player2!=null)
        {
            //補(bǔ)償相機(jī)的位置;或者說(shuō)保持偏移值炸站;
            gameObject.transform.position = offset + (player1.position + player2.position) / 2;

            //兩個(gè)坦克走近視野變小星澳,走遠(yuǎn)視野變大
            //計(jì)算距離;
            float distance = Vector3.Distance(player1.position, player2.position);
            //計(jì)算出來(lái)是 相機(jī)size 7.5/(7.33+1.12)=0.88
            float size = distance * 0.88f;
            //正交視野
            camera.orthographicSize = size;
        }
    }
}

Shell


public class Shell : MonoBehaviour {

    //定義一個(gè)子彈爆炸的預(yù)置體旱易,預(yù)置體記得勾選play  on awake禁偎;
    public GameObject shellExplosionPrefab;


    //定義一個(gè)子彈爆炸的聲音的變量;
    public AudioClip shellExplosionAudio;
    //觸發(fā)方法阀坏,將子彈設(shè)置成觸發(fā)器如暖;
    void OnTriggerEnter(Collider coll) {

        //子彈爆炸的聲音;
        AudioSource.PlayClipAtPoint(shellExplosionAudio,transform.position);
       //生成爆炸效果       GameObject.Instantiate(shellExplosionPrefab,transform.position,transform.rotation);

        //注意順序忌堂,別吧銷(xiāo)毀子彈放在前面盒至;      
        //銷(xiāo)毀子彈
        GameObject.Destroy(this.gameObject);

        //判斷坦克受到傷害;如果受到傷害 發(fā)送一個(gè)消息士修,調(diào)用更改生命的方法 在判斷之前先把坦克定義一個(gè)便簽
        if (coll.tag == "Tank")
        {
            coll.SendMessage("TakeDamage");
        }
    }

}

TankAttack

public class TankAttack : MonoBehaviour {

    //定義一個(gè)子彈預(yù)置體并且賦值枷遂;
    public GameObject shellPrefab;

    //定義一個(gè)變量,通過(guò)查找空物體位置棋嘲;用來(lái)存放實(shí)例化的位置
    private Transform m_Transform;

    //定義一個(gè)發(fā)射子彈的按鍵登淘;
    public KeyCode fireKey = KeyCode.Space;

    //定義一個(gè)子彈的速度
    public float shellSpeed = 15;


    //定義一個(gè)發(fā)射子彈的聲音;
    public AudioClip shellAudio;

    void Start () {
    
        //給定義的transform賦值封字;
        m_Transform = gameObject.transform.Find("FirePosition");
      
    }
    
    
    void Update () {
    
        //如果按下空格鍵黔州,實(shí)例化子彈; 第一種
        ////if (Input.GetKeyDown(KeyCode.Space))
        ////{
        ////    GameObject.Instantiate(shellPrefab,m_Transform.position,Quaternion.identity);
        ////}


        //第二種
        if (Input.GetKeyDown(fireKey))
        {
            //按下發(fā)射鍵時(shí)播放子彈聲音
            AudioSource.PlayClipAtPoint(shellAudio,transform.position);


           // GameObject.Instantiate(shellPrefab,m_Transform.position,m_Transform.rotation);

            GameObject go = GameObject.Instantiate(shellPrefab,m_Transform.position,transform.rotation) as GameObject;
            go.GetComponent<Rigidbody>().velocity = go.transform.forward * shellSpeed;
        }

    }
}

TankHealth

public class TankHealth : MonoBehaviour {

    //定義一個(gè)坦克爆炸特效的預(yù)置體 勾選play on awake阔籽;

    public GameObject TankExplosionPrefab;

    //定義坦克的血量流妻;
    public  int hp = 100;


    //聲明一個(gè)坦克爆炸的聲音的變量;
    public AudioClip tankExplosionAudio;


    //聲明一個(gè)UI的組件slider來(lái)獲取變量笆制;范圍是從0到1绅这;
    public Slider hpSlider;

    //聲明一個(gè)生命值,作為分母在辆,記錄整體的血量比例 因?yàn)閟lider的值是從0至1的证薇;
    private int totalHp;

    void Start () {
    
        //給總血量賦值
        totalHp = hp;

    }


    //定義傷害的方法;
    void TakeDamage() {

        //判斷血量
        if (hp > 0)
        {
            //隨機(jī)一個(gè)傷害值匆篓,看誰(shuí)運(yùn)氣好
           hp -= Random.Range(5, 10);
            //Debug.Log(hp);

           //用slider的value來(lái)顯示 記得是float類(lèi)型
           //  hpSlider.value = hp / totalHp as float;
           hpSlider.value = (float)hp / totalHp;
           Debug.Log(hpSlider.value);
        }
        if (hp<=0) { 

          
            //播放坦克爆炸的聲音浑度;在某個(gè)固定點(diǎn)的位置播放;
            AudioSource.PlayClipAtPoint(tankExplosionAudio,transform.position);//參數(shù)1:聲音源 參數(shù)2:位置鸦概;



            //小于0 的時(shí)候 播放坦克爆炸特效箩张,并銷(xiāo)毀坦克  怎么播放特效?定義好預(yù)置體,并實(shí)例化
              //播放爆炸效果
            GameObject.Instantiate(TankExplosionPrefab,transform.position+Vector3.up,transform.rotation);//在坦克上空爆炸      
            //銷(xiāo)毀坦克
            GameObject.Destroy(this.gameObject);
        }
   
    }

}

TankAttack
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末先慷,一起剝皮案震驚了整個(gè)濱河市饮笛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌论熙,老刑警劉巖福青,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脓诡,居然都是意外死亡素跺,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)誉券,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人刊愚,你說(shuō)我怎么就攤上這事踊跟。” “怎么了鸥诽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵商玫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我牡借,道長(zhǎng)拳昌,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任钠龙,我火速辦了婚禮炬藤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碴里。我一直安慰自己沈矿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布咬腋。 她就那樣靜靜地躺著羹膳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪根竿。 梳的紋絲不亂的頭發(fā)上陵像,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音寇壳,去河邊找鬼醒颖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛壳炎,可吹牛的內(nèi)容都是我干的图贸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼疏日!你這毒婦竟也來(lái)了偿洁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤沟优,失蹤者是張志新(化名)和其女友劉穎涕滋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體挠阁,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宾肺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侵俗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锨用。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隘谣,靈堂內(nèi)的尸體忽然破棺而出增拥,到底是詐尸還是另有隱情,我是刑警寧澤寻歧,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布掌栅,位于F島的核電站,受9級(jí)特大地震影響码泛,放射性物質(zhì)發(fā)生泄漏猾封。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一噪珊、第九天 我趴在偏房一處隱蔽的房頂上張望晌缘。 院中可真熱鬧,春花似錦痢站、人聲如沸枚钓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)搀捷。三九已至,卻和暖如春多望,著一層夾襖步出監(jiān)牢的瞬間嫩舟,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工怀偷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留家厌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓椎工,卻偏偏與公主長(zhǎng)得像饭于,于是被迫代替她去往敵國(guó)和親蜀踏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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