具体实施步骤
1)首先先布置一个场景,创建一个Empty当做子弹的发射点,然后再创建一个Cube,调整其合适的大小和位置,然后使之与子弹发射点在z轴上处于同一位置,我们之后将创建子弹沿着Z轴运动射击到Cube上。
2)创建子弹:创建一个Empty,然后再创建一个Capsule用作模拟子弹,调整合适的大小,移除其Capsule Collider组件,然后将Capsule挂在刚创建好的Empty下,并为Empty添加Rigibody和Capsule Collider组件。
然后我们需要几个脚本:控制发射子弹的脚本,子弹移动的脚本,子弹撞击Cube触发效果的脚本。
代码如下
控制发射子弹的脚本:
using UnityEngine;
using System.Collections;
public class _Shoot : MonoBehaviour {
public Transform rocket;
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(rocket, transform.position, Quaternion.identity);
}
}
}
子弹移动的脚本:
using UnityEngine;
using System.Collections;
public class _RocketMove : MonoBehaviour {
public Vector3 v;
void Start () {
v = new Vector3(0, 0, 100);
}
void Update () {
transform.position += v * Time.deltaTime;
}
}
子弹撞击Cube触发效果的脚本:
using UnityEngine;
using System.Collections;
public class _Collision : MonoBehaviour
{
public Transform explosionPrefab;
void OnCollisionEnter(Collision collision)
{
ContactPoint contact = collision.contacts[0];
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point;
Instantiate(explosionPrefab, pos, rot);
Destroy(this.gameObject);
}
}
由于前两个脚本比较简单,这里不再赘述,这里主要讲解一下第三个脚本。
第三个脚本是API提供的一个范例,它主要利用OnCollisionEnter的事件触发来完成击打的效果。
定义了explosionPrefab用于存放效果的Prefab;
在事件内部,定义了contact意为碰撞的接触点,参数collision表示被碰物体的碰撞信息,它包含一个碰撞点信息的数组,我们获取其下标为0的碰撞点;
FromToRatation方法用于获取一个从Vector3.up到contact.normal的旋转,其中normal表示contact的法向量;
Pos获取碰撞点的位置;
创建效果;
销毁子弹本身。
第一个脚本我们挂在子弹的发射器上,后两个脚本我们挂在子弹上,并将子弹做成Prefab,然后将其指定给子弹发射器。粒子效果我们可以导入Unity自带的粒子系统包,然后选择合适的效果将其指定给子弹的脚本。