天天看点

Unity3D之太空大战二

接下来,我们要使飞船能发射子弹,所以我们要创建子弹模型,在资源中找到rocket.fbx模型文件,拖到Hierarchy中,这样就创建了子弹的游戏体,当然对于重复使用的游戏体,我们要做成预设体Prefab,我们打开菜单栏Assets->Create->Prefab,来创建一个新的预设体,如下图:

Unity3D之太空大战二

我们命名为Rocket,

Unity3D之太空大战二

那么子弹,飞船要发射,所以我们新建一个cs脚本,命名为Rocket,代码如下:

using UnityEngine;
using System.Collections;

[AddComponentMenu("MyGame/Rocket")]


public class Rocket : MonoBehaviour {

	//子弹飞行速度
	public float m_speed=10;

	//生存时间
	public float m_liveTime=1;

	//威力
	public float m_power=1.0f;


	protected Transform m_transform;


	// Use this for initialization
	void Start () 
	{
	

		m_transform=this.transform;


	}
	
	// Update is called once per frame
	void Update () 
	{
	
		m_liveTime-=Time.deltaTime;


		if(m_liveTime<=0)
		{


			Destroy(this.gameObject);

		}

		this.m_transform.Translate(new Vector3(0,0,-m_speed*Time.deltaTime));

	}

}
           

把子弹脚本挂到子弹prefab上,然后我们再修改Player脚本,当我们按下空格或是鼠标左键的时候,就发射子弹,代码如下:

//			if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
//			{
//				
//				
//				
//				Instantiate(m_rocket,m_transform.position,m_transform.rotation);
//				
//
//			}
           

这样飞船就可以发射子弹了,但现在发射子弹的频率太快,所以我们定义一个变量来控制频率,每隔0.1秒发射一次,代码如下:

if(m_rocketRate<=0)
		{


			m_rocketRate=0.1f;



//			if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
//			{
//				
//				
//				
//				Instantiate(m_rocket,m_transform.position,m_transform.rotation);
//				
//
//			}
		}
           

效果如下:

Unity3D之太空大战二

接下来我们创建简单的敌人,不能发射子弹,只能左右旋转沿弧线前进,跟前面创建子弹一样,我们找到Enemy.fbx文件拖到Hierarchy中,然后创建敌人Prefab,并命名为Enemy,如下图:

Unity3D之太空大战二

然后我们创建cs脚本,命名为Enemy,代码如下:

sing System.Collections;


[AddComponentMenu("MyGame/Enemy")]

public class Enemy : MonoBehaviour {

	//速度
	public float m_speed=1;
	//旋转速度
	protected float m_rotspeed=30;
	//变相间隔时间
	protected float m_timer=1.5f;
	//生命
	public float m_life = 10;

	protected Transform m_transform;

	public int m_point=10;

	// Use this for initialization
	void Start () 
	{

		m_transform = this.transform;
	
	}
	
	// Update is called once per frame
	void Update () 
	{

		UpdateMove ();

	
	}


	protected virtual void UpdateMove()
	{

		m_timer -= Time.deltaTime;


		if (m_timer <= 0)
		{
		
			m_timer=3;

		
			m_rotspeed=-m_rotspeed;

		
		}

		//旋转方向
		m_transform.Rotate (Vector3.up, m_rotspeed * Time.deltaTime, Space.World);

		m_transform.Translate (new Vector3 (0, 0, -m_speed * Time.deltaTime));
	}

}
           

这里我们每隔3秒改变敌人一次旋转方向,我们把脚本挂到敌人prefab上,运行如下图:

Unity3D之太空大战二

不过现在飞船发射子弹也打不到敌人,飞船跟敌人之间也没任何交互,这里没有任何碰撞检测,所以接下来,我们添加物理碰撞,我们先给敌人添加碰撞体跟刚体,所有需要参与物理计算的游戏体都需要有一个刚体组件才能正常工作,

Unity3D之太空大战二
Unity3D之太空大战二

然后box Collider属性中,我们选中Is Trigger,使其具有触发作用,在rigidbody组件中,取消选中Use Gravity去掉重力影响,然后选中Is Kinematic使游戏体的运动不受物理模拟影响,如下图:

Unity3D之太空大战二

然后参考前面的方法给主角飞船跟子弹都添加物理组件,

Unity3D之太空大战二

最后,为了区别到这些组件,我们给它们设置Tag标示,选择Edit->Project Settings->Tag and Layers,

Unity3D之太空大战二

我们设置如下tag,

Unity3D之太空大战二

接下来我们就修改相关脚本,首页打开Enemy.cs脚本,添加一个生命属性:

//生命
	public float m_life = 10;
           

然后添加一个OnTriggerEnter函数,在碰撞体相互接触时会被触发,

void OnTriggerEnter(Collider other)
	{


		if (other.tag.CompareTo ("PlayerRocket") == 0) 
		{

			Rocket rocket = other.GetComponent<Rocket> ();

					
			m_life -= rocket.m_power;

						
			if (m_life <= 0) {


				GameManager.Instance.AddScroe(m_point);


				Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);

				Destroy (this.gameObject);


					
			}

		} 
		else if (other.tag.CompareTo ("Player") == 0)
		{
				
		
			m_life=0;

			Instantiate(m_explosionFX, m_transform.position, Quaternion.identity);

			Destroy(this.gameObject);


		
		}
           

然后打开Rocket.cs脚本,也添加一个OnTriggerEnter函数,如果子弹撞到敌人,销毁自身

void OnTriggerEnter(Collider other)
	{



		if (other.tag.CompareTo ("Enemy") == 0) {
				

					
			Destroy (this.gameObject);


		} else 
		{

			return;


		}




	}
           

最好修改Player.cs,添加一个生命属性,然后也添加一个OnTriggerEnter函数,主角飞船与任何已方子弹以外的碰撞体相撞都会损失一点生命,生命为0时销毁自身,

//生命
public float m_life=3;
           
void OnTriggerEnter(Collider other)
	{



		if (other.tag.CompareTo ("PlayerRocket") != 0) 
		{


			m_life-=1;


			if(m_life<=0)
			{


				Instantiate(m_explosionFX,m_transform.position,Quaternion.identity);


				Destroy(this.gameObject);


			}


		}




	}
           

运行,如下:

Unity3D之太空大战二

最后,我们判断下出界,当敌人出界时,就销毁自身,同上面一样,创建一个空的游戏体,命名为bound,添加一个bound的tag,和相关物理组件,

Unity3D之太空大战二

属性如下:

Unity3D之太空大战二

修改Enmey.cs脚本

else if (other.tag.CompareTo ("bound") == 0)
		{
			
			
			m_life=0;
			
			Destroy(this.gameObject);
			
			Debug.Log("---destroy");
			
		}
           

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

继续阅读