在场景中建立子弹,以及一个打击目标,目标具备一定的生命值(HP),当生命值将为0时,目标被击落并消失。
1. 新建一个球体Sphere当子弹,将其命名为Bullet。
调整其大小和材质(比如金色),并确保它具有碰撞体"Collider"属性,以及勾选“Is Trigger”属性。只有勾选了“Is Trigger”,Bullet.cs脚本中的OnTriggerEnter函数才会起作用。
2. 新建一个子弹的程序Bullet.cs。其中的OnTriggerEnter(Collider other)函数中,检测子弹打到的物体上是否挂载有BulletTarget脚本,如果有,才是子弹的目标,否则仅仅让子弹消失,不做任何动作处理。
public class Bullet : MonoBehaviour
{//子弹脚本,挂在子弹身上
public float moveSpeed=10; //子弹移动速度
void Start()
{
Destroy(gameObject,5f);//不管有没有打到东西,子弹在场景5秒钟就消失
}
void Update()
{//子弹一旦进入场景,就向着自己的前方飞
transform.Translate(Vector3.forward*moveSpeed*Time.deltaTime,Space.Self);
}
private void OnTriggerEnter(Collider other)
{//当子弹碰撞到其他物体
Destroy(gameObject); //不管碰到什么,都让子弹消失
var target = other.gameObject.GetComponent<BulletTarget>();
//尝试载入被子弹打到的BulletTarget脚本,如果目标挂有这个脚本,就扣除目标的血量
if (target == null)
return;
target.HP -= 10;
}
}
3. 将第2步的Bullet程序拖拽到金色的Bullet模型上。
4. 将修改完成的子弹模型拖入Assets文件夹内,它就被保存为一个预制体(Prefab)。之后还需要删除场景中的子弹模型,使之不会出现在开场游戏界面中。
5. 别忘了之前我们建立的第一人称控制器中,有一段关于子弹的代码被注释了,打开那段代码后,需要把上面存的"子弹预制体"拖到第一人称控制器的Inspector中,赋值给BulletTemplate变量。
6. BulletTarget.cs 脚本如下,将此脚本挂载在一切你希望成为子弹目标的对象上。值得注意的是,子弹的目标上还需要挂在Rigidbody组件。
public class BulletTarget : MonoBehaviour
{//子弹的目标
public float HP;
void Start()
{
HP = 100;
}
// Update is called once per frame
void Update()
{
if (HP <= 0)
{
var rig = gameObject.transform.GetComponent<Rigidbody>();
//获取目标上挂的Rigidbody组件
rig.useGravity = true; //将重力设置为true
Destroy(gameObject,1f);
}
}
}
7. 在场景中,建立子弹目标对象,并加载BulletTarget.cs脚本。需要注意:
(1)子弹目标对象必须具备Collider(碰撞体),不然子弹检测不到;
(2)子弹目标对象必须添加Rigidbody(刚体)属性,并取消重力勾选(否则就没有掉落的效果了)。
8. 在后文添加了UI界面、主角控制脚本之后,可以设置击落目标后给主角加分。之后再修改BulletTarget.cs,用于显示分数和目前的状态。