雷霆战机(一)
注:本文包括雷霆战机的第一部分,在没书的情况下,慢慢摸索自己真的了解到许多知识,现于初学者分享并求指教,因为自己是初学者中间可能会有许多不成熟的地方或者错误的地方,望指教。再次重申本人为初学者,老手请点右上方。
准备工作:一个飞机图片、一个子弹图片、一个陨石图片
1.新建项目、导入资源、设置正交投影、添加灯光
2.选择Project窗格中的sprite对象,将对象拉到Hierarchy(层次视图)并更名为plane,将飞机图片拉到Hierarchy中的plane的游戏对象,plane就变为一个飞机外表的游戏对象,新建一个名称为plane_01的C#代码并加入到plane游戏对象上。
(注:Hierarchy视图是主要放于游戏场景中具体的游戏对象,比如摄像机平面贴图、3D贴图、光源、箱子、球体、胶囊体、平面和地形等。)
using UnityEngine; using System.Collections; public class plane_01 : MonoBehaviour {//Transform是类型 transform是属性 public GameObject projectile; // Use this for initialization void Start () { } private float speed = 5.0f; // Update is called once per frame void Update () { transform.Translate(Input.GetAxis("Horizontal")*speed*Time.deltaTime,0,0);//Input.GetAxis使用控制器和键盘输入时此值范围在-1到1之间。 transform.Translate (0,Input.GetAxis("Vertical")*speed*Time.deltaTime,0); if(transform.position.x<-6.8f) transform.position = new Vector3(6.0f,transform.position.y,transform.position.z); if(transform.position.x>6.8f) transform.position = new Vector3(-6.0f,transform.position.y,transform.position.z); if(transform.position.y<-4.3f) transform.position = new Vector3(transform.position.x,6.3f,transform.position.z); if(transform.position.y>6.3f) transform.position = new Vector3(transform.position.x,-4.3f,transform.position.z); //if(Input.GetKeyDown(KeyCode.Space)) // Instantiate(projectile,transform.position,transform.rotation); } }
3.选择Project窗格中的sprite对象,将对象拉到Hierarchy(层次面板)并更名为buttle,将子弹图片拉到
Hierarchy中的buttle的游戏对象,buttle就变为一个子弹外表的游戏对象,新建一个名称为buttle_01的C#代码并加入到buttle游戏对象上。
子弹代码:
using UnityEngine; using System.Collections; public class buttle_01 : MonoBehaviour { // Use this for initialization void Start () { } private float speed = 6.0f; // Update is called once per frame void Update () { transform.Translate(0,speed*Time.deltaTime,0); if(transform.position.y>6.3f) Destroy(this.gameObject); } }
4.完善飞机代码,使飞机可以发射子弹。如何使飞机发射子弹呢?具体代码在飞机代码注释掉的那部分,即下列代码:
if(Input.GetKeyDown(KeyCode.Space))//如果按下space则实例化标签为projectile的对象。 Instantiate(projectile,transform.position,transform.rotation);
什么是实例化呢? 实例化即克隆原始物体并返回克隆物体。注意三个参数:第一个标签名,第二个位置、第三个旋转度。接下来就是对子弹做标签了:Inspector(监视面板)—〉Tag—〉Add Tag—〉Element 0,再点回层次面板OK.
5.选择Project窗格中的sprite对象,将对象拉到Hierarchy(层次视图)并更名为rock,将飞机图片拉到
Hierarchy中的rock的游戏对象,rock就变为一个飞机外表的游戏对象,新建一个名称为rock_01的C#代码并加入到rock游戏对象上。
rock代码:
using UnityEngine; using System.Collections; public class rock_o1 : MonoBehaviour { public float speed = 2.0f; //public GameObject explosionEnemy; //public GameObject explosionPlayer; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate(0,-speed*Time.deltaTime,0); if(transform.position.y<-4.3) transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); } }
6.将飞机、子弹、陨石相关联。
经过以上步骤,飞机就可以发射了,陨石也可以不停掉落了。但是有一个问题不得不考虑了,就是如何使飞机发射的子弹与陨石有关联呢?
第一步:先将Is Trigger勾上。
第二步:设置碰撞机和刚体。
这里涉及到两个概念了,Collider(碰撞机)与Rigidbody(刚体),如果我们希望两个物体发生触发,就要使两个物体均带有碰撞机,假设一个相对静止、一个相对运动,相对运动的要带有刚体。
比如飞机、子弹、陨石,子弹遇陨石碰撞、飞机遇陨石碰撞,所以这里我可以假设陨石是相对运动的,将陨石加入碰撞机、刚体,子弹和飞机仅加碰撞机,三者之间就可以相互发生碰撞了。
刚体:具有物理属性,例如具有重力,受物理作用。
碰撞体:可以理解为碰撞后的力。
Is Trigger:勾上后,该对象就变成了一个虚体,不受力,但是可以发生碰撞事件,只要满足上述条件。
那碰撞器与触发器的区别?
如果既要检测到物体的接触,又要使碰撞不影响物体的移动就要是有触发器,例如,开门、关门,子弹击中飞机。如果碰撞后想要产生碰撞效果,例如:汽车相撞,球拍击球,就要取消触发器。
第三步:做标签。这里我将子弹标签为projectile,飞机标签为player。
然后在rock代码上加上:
void OnTriggerEnter (Collider other){ Debug.Log(other.tag); if(other.tag == "projectile"){//发生触发重置陨石 //transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); Destroy(other.gameObject); } if(other.tag == "player"){//发生触发重置陨石 transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); } }rock代码变成:
using UnityEngine; using System.Collections; public class rock_o1 : MonoBehaviour { public float speed = 2.0f; public GameObject explosionEnemy; public GameObject explosionPlayer; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate(0,-speed*Time.deltaTime,0); if(transform.position.y<-4.3) transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); } void OnTriggerEnter (Collider other){ Debug.Log(other.tag); if(other.tag == "projectile"){ Instantiate(explosionEnemy,transform.position,transform.rotation); //transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); Destroy(other.gameObject); } if(other.tag == "player"){ //Instantiate(explosionPlayer,transform.position,transform.rotation); transform.position = new Vector3(Random.Range(-6.0f,6.0f),6.3f,0); } } }
OK,这样就达到了,子弹遇陨石,陨石重置(消失并从屏幕上方飞出);飞机遇陨石,陨石重置的效果。