Unity 3D学习之雷霆战机(一)

雷霆战机(一)

注:本文包括雷霆战机的第一部分,在没书的情况下,慢慢摸索自己真的了解到许多知识,现于初学者分享并求指教,因为自己是初学者中间可能会有许多不成熟的地方或者错误的地方,望指教。再次重申本人为初学者,老手请点右上方。

准备工作:一个飞机图片、一个子弹图片、一个陨石图片


1.新建项目、导入资源、设置正交投影、添加灯光


2.选择Project窗格中的sprite对象,将对象拉到Hierarchy(层次视图)并更名为plane,将飞机图片拉到Hierarchy中的plane的游戏对象,plane就变为一个飞机外表的游戏对象,新建一个名称为plane_01C#代码并加入到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_01C#代码并加入到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_01C#代码并加入到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,这样就达到了,子弹遇陨石,陨石重置(消失并从屏幕上方飞出);飞机遇陨石,陨石重置的效果。

































  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值