具体实施步骤
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自带的粒子系统包,然后选择合适的效果将其指定给子弹的脚本。

泰课在线
运行游戏,我们将看到子弹碰到Cube时会消失,并产生一个粒子效果