我是靠谱客的博主 紧张镜子,这篇文章主要介绍Unity3D之太空大战二,现在分享给大家,希望可以做个参考。

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


我们命名为Rocket,

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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脚本,当我们按下空格或是鼠标左键的时候,就发射子弹,代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
// if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0)) // { // // // // Instantiate(m_rocket,m_transform.position,m_transform.rotation); // // // }
这样飞船就可以发射子弹了,但现在发射子弹的频率太快,所以我们定义一个变量来控制频率,每隔0.1秒发射一次,代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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); // // // } }

效果如下:

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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上,运行如下图:


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




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


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


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


我们设置如下tag,


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

复制代码
1
2
3
//生命 public float m_life = 10;
然后添加一个OnTriggerEnter函数,在碰撞体相互接触时会被触发,

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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函数,如果子弹撞到敌人,销毁自身

复制代码
1
2
3
4
5
6
7
8
9
10
void OnTriggerEnter(Collider other) { if (other.tag.CompareTo ("Enemy") == 0) { Destroy (this.gameObject); } else { return; } }
最好修改Player.cs,添加一个生命属性,然后也添加一个OnTriggerEnter函数,主角飞船与任何已方子弹以外的碰撞体相撞都会损失一点生命,生命为0时销毁自身,

复制代码
1
2
//生命 public float m_life=3;
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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); } } }

运行,如下:


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


属性如下:


修改Enmey.cs脚本

复制代码
1
2
3
4
5
6
else if (other.tag.CompareTo ("bound") == 0) { m_life=0; Destroy(this.gameObject); Debug.Log("---destroy"); }




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











最后

以上就是紧张镜子最近收集整理的关于Unity3D之太空大战二的全部内容,更多相关Unity3D之太空大战二内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部