2.5.3 创建子弹
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_trasform;
// Use this for initialization
void Start ()
{
m_trasform = this.transform;
Destroy(this.gameObject, m_liveTime); // 其中填入了 m_liveTime作为参数,表示在一定时间后销毁自身。
}
// Update is called once per frame
void Update ()
{
m_trasform.Translate(new Vector3(0, 0, -m_speed * Time.deltaTime));
}
}
2.5.4创建子弹Prefab
对于需要重复使用的游戏体,我们需要将其制作成Prefab。在任何事件、场景、甚至在其他Unity游戏中重复使用。
创建一个Prefabs的文件夹用于保存Prefab,右键创建一个Prefabs。在Hierarchy窗口中选择创建的游戏体,将其拖动到刚刚创建的prefab上,制作dong了。
那么,场景中的原始子弹游戏体已经不再需要了,可以delete。
2.5.5发射子弹
用Inistantiate函数动态的创建子弹游戏体;
将飞船和子弹的Prefab关联起来,添加一个Transform属性,它将指向子弹的Prefab,
如:
public Transform m_rocket;
在Unity编辑器中,选择Player游戏体,在Inspector窗口中找到脚本组件会发行多增加了一个Rocket 选项,选择子弹的Prefab,将其拖到Rocket选项上,
void Update ()
{
// 按 空格键 或 鼠标左键 发射子弹
<span style="white-space:pre"> </span>if(Input.GetKey(KeyCode.Space) || Input.GetMouseButton(0))
{
Instantiate(m_rocket, m_transform.position, m_transform.rotation );
m_audio.PlayOneShot(m_shootClip); // 播放射击声音
}
}
Unity的游戏体只能使用Instantiate函数实例化。
修改发射速度,保证按一下,发射一个子弹:
添加一个控制发射频率的属性
// 发射子弹频率
float m_rocketRate = 0;
void Update ()
{
<span style="white-space:pre"> // 每隔0.1秒发射一次子弹
m_rocketRate -= Time.deltaTime;
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 );
}
}</span>
}
2.6 创建敌人
创建Enemy.cs脚本,添加代码如下:
[AddComponentMenu("MyGame/Enemy")]
public class Enemy : MonoBehaviour
{
// 移动速度
public float m_speed = 1;
// 旋转速度
protected float m_rotSpeed = 30;
protected Transform m_transform;
// Use this for initialization
void Start ()
{
m_transform = this.transform;
}
// Update is called once per frame
void Update ()
{
UpdateMove();
}
protected void UpdateMove()
{
// 左右移动
float rx = Mathf.Sin(Time.time) * Time.deltaTime;
// 前进
m_transform.Translate(new Vector3(rx, 0, -m_speed * Time.deltaTime));
}
}
UpdateMove函数用来执行敌人的移动,使用了Sin函数使数值在-1~1之间循环变化,敌人在向前飞行的同时,还将左右迂回移动。
在Project窗口找到Enemy.fbx文件,为其创建Prefab,并指定Enemy脚本作为其
组件。
2.7.1 添加碰撞体
我们先给敌人添加碰撞体。在场景中选择任意一个敌人,在菜单栏选择【Component】→【Physics】→【Box Collider】为敌人添加一个
立方体碰撞体组件
,然后在Inspector窗口找到【Box Collider】
组件
,选中【Is Trigger】,使其具有触发作用,如图2-21所示。
接着在菜单栏选择【Component】→【Physics】→【Rigidbody】为敌人添加一个
刚体组件,所有需要参与物理计算的游戏体都需要有一个刚体组件才能正常工作。在Inspector窗口找到【Rigidbody】组件,取消选择【Use Gravity】去掉重力影响,选中【Is Kinematic】使游戏体的运动不受物理模拟影响,如图2-22所示。
现在,我们已经为场景中的一个敌人添加并设置了相关的物理组件,确定其处于选择状态,在Inspector窗口的右下角选择【Apply】,如图2-23所示,原始敌人的Prefab及场景中的其他敌人会自动更新到当前敌人的设置。
如果是在Project窗口修改原始敌人Prefab的设置,场景中的敌人游戏体会自动更新与Prefab一致。