Unity3D之太空大戰二

接下來,我們要使飛船能發射子彈,所以我們要創建子彈模型,在資源中找到rocket.fbx模型文件,拖到Hierarchy中,這樣就創建了子彈的遊戲體,當然對於重複使用的遊戲體,我們要做成預設體Prefab,我們打開菜單欄Assets->Create->Prefab,來創建一個新的預設體,如下圖:


我們命名爲Rocket,

那麼子彈,飛船要發射,所以我們新建一個cs腳本,命名爲Rocket,代碼如下:

[csharp] view plain copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. [AddComponentMenu("MyGame/Rocket")]  
  5.   
  6.   
  7. public class Rocket : MonoBehaviour {  
  8.   
  9.     //子彈飛行速度  
  10.     public float m_speed=10;  
  11.   
  12.     //生存時間  
  13.     public float m_liveTime=1;  
  14.   
  15.     //威力  
  16.     public float m_power=1.0f;  
  17.   
  18.   
  19.     protected Transform m_transform;  
  20.   
  21.   
  22.     // Use this for initialization  
  23.     void Start ()   
  24.     {  
  25.       
  26.   
  27.         m_transform=this.transform;  
  28.   
  29.   
  30.     }  
  31.       
  32.     // Update is called once per frame  
  33.     void Update ()   
  34.     {  
  35.       
  36.         m_liveTime-=Time.deltaTime;  
  37.   
  38.   
  39.         if(m_liveTime<=0)  
  40.         {  
  41.   
  42.   
  43.             Destroy(this.gameObject);  
  44.   
  45.         }  
  46.   
  47.         this.m_transform.Translate(new Vector3(0,0,-m_speed*Time.deltaTime));  
  48.   
  49.     }  
  50.   
  51. }  
把子彈腳本掛到子彈prefab上,然後我們再修改Player腳本,當我們按下空格或是鼠標左鍵的時候,就發射子彈,代碼如下:

[csharp] view plain copy
  1. //          if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))  
  2. //          {  
  3. //                
  4. //                
  5. //                
  6. //              Instantiate(m_rocket,m_transform.position,m_transform.rotation);  
  7. //                
  8. //  
  9. //          }  
這樣飛船就可以發射子彈了,但現在發射子彈的頻率太快,所以我們定義一個變量來控制頻率,每隔0.1秒發射一次,代碼如下:

[csharp] view plain copy
  1.         if(m_rocketRate<=0)  
  2.         {  
  3.   
  4.   
  5.             m_rocketRate=0.1f;  
  6.   
  7.   
  8.   
  9. //          if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))  
  10. //          {  
  11. //                
  12. //                
  13. //                
  14. //              Instantiate(m_rocket,m_transform.position,m_transform.rotation);  
  15. //                
  16. //  
  17. //          }  
  18.         }  

效果如下:

接下來我們創建簡單的敵人,不能發射子彈,只能左右旋轉沿弧線前進,跟前面創建子彈一樣,我們找到Enemy.fbx文件拖到Hierarchy中,然後創建敵人Prefab,並命名爲Enemy,如下圖:

然後我們創建cs腳本,命名爲Enemy,代碼如下:

[csharp] view plain copy
  1. sing System.Collections;  
  2.   
  3.   
  4. [AddComponentMenu("MyGame/Enemy")]  
  5.   
  6. public class Enemy : MonoBehaviour {  
  7.   
  8.     //速度  
  9.     public float m_speed=1;  
  10.     //旋轉速度  
  11.     protected float m_rotspeed=30;  
  12.     //變相間隔時間  
  13.     protected float m_timer=1.5f;  
  14.     //生命  
  15.     public float m_life = 10;  
  16.   
  17.     protected Transform m_transform;  
  18.   
  19.     public int m_point=10;  
  20.   
  21.     // Use this for initialization  
  22.     void Start ()   
  23.     {  
  24.   
  25.         m_transform = this.transform;  
  26.       
  27.     }  
  28.       
  29.     // Update is called once per frame  
  30.     void Update ()   
  31.     {  
  32.   
  33.         UpdateMove ();  
  34.   
  35.       
  36.     }  
  37.   
  38.   
  39.     protected virtual void UpdateMove()  
  40.     {  
  41.   
  42.         m_timer -= Time.deltaTime;  
  43.   
  44.   
  45.         if (m_timer <= 0)  
  46.         {  
  47.           
  48.             m_timer=3;  
  49.   
  50.           
  51.             m_rotspeed=-m_rotspeed;  
  52.   
  53.           
  54.         }  
  55.   
  56.         //旋轉方向  
  57.         m_transform.Rotate (Vector3.up, m_rotspeed * Time.deltaTime, Space.World);  
  58.   
  59.         m_transform.Translate (new Vector3 (0, 0, -m_speed * Time.deltaTime));  
  60.     }  
  61.   
  62. }  
這裏我們每隔3秒改變敵人一次旋轉方向,我們把腳本掛到敵人prefab上,運行如下圖:


不過現在飛船發射子彈也打不到敵人,飛船跟敵人之間也沒任何交互,這裏沒有任何碰撞檢測,所以接下來,我們添加物理碰撞,我們先給敵人添加碰撞體跟剛體,所有需要參與物理計算的遊戲體都需要有一個剛體組件才能正常工作,




然後box Collider屬性中,我們選中Is Trigger,使其具有觸發作用,在rigidbody組件中,取消選中Use Gravity去掉重力影響,然後選中Is Kinematic使遊戲體的運動不受物理模擬影響,如下圖:


然後參考前面的方法給主角飛船跟子彈都添加物理組件,


最後,爲了區別到這些組件,我們給它們設置Tag標示,選擇Edit->Project Settings->Tag and Layers,


我們設置如下tag,


接下來我們就修改相關腳本,首頁打開Enemy.cs腳本,添加一個生命屬性:

[csharp] view plain copy
  1. //生命  
  2.     public float m_life = 10;  
然後添加一個OnTriggerEnter函數,在碰撞體相互接觸時會被觸發,

[csharp] view plain copy
  1. void OnTriggerEnter(Collider other)  
  2.     {  
  3.   
  4.   
  5.         if (other.tag.CompareTo ("PlayerRocket") == 0)   
  6.         {  
  7.   
  8.             Rocket rocket = other.GetComponent<Rocket> ();  
  9.   
  10.                       
  11.             m_life -= rocket.m_power;  
  12.   
  13.                           
  14.             if (m_life <= 0) {  
  15.   
  16.   
  17.                 GameManager.Instance.AddScroe(m_point);  
  18.   
  19.   
  20.                 Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);  
  21.   
  22.                 Destroy (this.gameObject);  
  23.   
  24.   
  25.                       
  26.             }  
  27.   
  28.         }   
  29.         else if (other.tag.CompareTo ("Player") == 0)  
  30.         {  
  31.                   
  32.           
  33.             m_life=0;  
  34.   
  35.             Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);  
  36.   
  37.             Destroy(this.gameObject);  
  38.   
  39.   
  40.           
  41.         }  
然後打開Rocket.cs腳本,也添加一個OnTriggerEnter函數,如果子彈撞到敵人,銷燬自身

[csharp] view plain copy
  1. void OnTriggerEnter(Collider other)  
  2. {  
  3.   
  4.   
  5.   
  6.     if (other.tag.CompareTo ("Enemy") == 0) {  
  7.               
  8.   
  9.                   
  10.         Destroy (this.gameObject);  
  11.   
  12.   
  13.     } else   
  14.     {  
  15.   
  16.         return;  
  17.   
  18.   
  19.     }  
  20.   
  21.   
  22.   
  23.   
  24. }  
最好修改Player.cs,添加一個生命屬性,然後也添加一個OnTriggerEnter函數,主角飛船與任何已方子彈以外的碰撞體相撞都會損失一點生命,生命爲0時銷燬自身,

[csharp] view plain copy
  1. //生命  
  2. public float m_life=3;  
[csharp] view plain copy
  1. void OnTriggerEnter(Collider other)  
  2. {  
  3.   
  4.   
  5.   
  6.     if (other.tag.CompareTo ("PlayerRocket") != 0)   
  7.     {  
  8.   
  9.   
  10.         m_life-=1;  
  11.   
  12.   
  13.         if(m_life<=0)  
  14.         {  
  15.   
  16.   
  17.             Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);  
  18.   
  19.   
  20.             Destroy(this.gameObject);  
  21.   
  22.   
  23.         }  
  24.   
  25.   
  26.     }  
  27.   
  28.   
  29.   
  30.   
  31. }  

運行,如下:


最後,我們判斷下出界,當敵人出界時,就銷燬自身,同上面一樣,創建一個空的遊戲體,命名爲bound,添加一個bound的tag,和相關物理組件,


屬性如下:


修改Enmey.cs腳本

[csharp] view plain copy
  1. else if (other.tag.CompareTo ("bound") == 0)  
  2.         {  
  3.               
  4.               
  5.             m_life=0;  
  6.               
  7.             Destroy(this.gameObject);  
  8.               
  9.             Debug.Log("---destroy");  
  10.               
  11.         }  

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