using UnityEngine;
using System.Collections;
public class SpawnBulletPoint : MonoBehaviour {
public float radius = 2f;
void OnDrawGizmos()
{
Gizmos.color = Color.green;//此线框球状物的颜色是红色的
Gizmos.DrawSphere(transform.position, radius);//创建一个线框球形
}
}
using UnityEngine;
using System.Collections;
public class BulletController : MonoBehaviour {
public float speed = 10f;
public float distance = 0.1f;
private LayerMask mask;
using UnityEngine;
using System.Collections;
public class SpawnBullet : MonoBehaviour {
public GameObject bullet;
public Transform Spawnpoint;
void OnGUI()
{
if(GUILayout.Button("SpawnBullet"))
{
Instantiate(bullet,Spawnpoint.position,Quaternion.identity);
}
}
}
不必说你也知道,只是克隆出子弹预设。下面我们将这个脚本绑定在摄像机上面,该拖拽的全都拖拽上去。我们的例子大概完成了。运行一下看看:
子弹出膛
子弹穿过第一个挡板,此时控制台上没有打印语句
子弹击中后面的挡板,瞬间消失,且打印出语句。
上面三个情形的结果是意料之中的,重要的是实现手法,我们现在仔细看看,挡子弹击中目标时,我们可以做一些事情,比如让目标减血,并且播放减血的动画。此例子中 只是简单的打印一行语句并销毁子弹。虽然简单,但却很重要,这预示着我们可以再次部分代码调用一些函数,我们看这一部分:
由于此函数我们可以获得hit实例,所以可以根据hit来获得被击中的GameObject,具体做法是
GameObject go = hit.transform.gameObject;
然后就可以调用go身上的某个脚本中的某个函数来执行相应的行为,比如掉血的函数等。而且此部分还运用了LayerMask类,这对于选择性的碰撞检测非常重要,比如我们规定子弹碰到了敌人之后让敌人掉血或死掉,碰到了墙壁之后就播放一个音频,且销毁子弹,碰到了布料后就直接穿过。仔细思考一下,我们可以在此处扩展一下,写一个工具类,然后里面写一个通用的方法,但是要有一个GameObject类型的参数,只要调用这个方法,我们就根据具体传过来的参数来执行相应的代码,我想一个Switch语句就可以吧!我们只需在上面这块代码中调用这个方法,且将hit.transform.gameObject传递到进去就不用再在里面多做些些什么了,只需在那个工具类中书写相应的行为就行了,维护起来特别方便,不是吗?
工具类中我们可以取得传过来的GameObject的tag的具体值来作为switch的判断条件,实现我们可以自定义一些tag,比如Enemy,Player,Wall等tag,然后根据传进来的GameObject并获取其tag来进行相应的case匹配,然后执行相应的动作。好了,这次就先介绍到这了,我将这个例子打个包,一并奉上。