目录
1.内容:
2.效果:
3.实现步骤:
(1)创建一个RayShooter脚本,附加到摄像机上
(2)RayShooter脚本内容:
(3) 敌人类:
1.内容:
添加敌人和子弹射击游戏 ///1.编写代码允许玩家向场景发射 /// ? ? ①shoot方法,从摄像机的中心发射射线,将碰撞点作为射击点,发射一个小球 /// ? ? ②OnGUI创建最上层图层,类似贴纸,用来当准心
2.效果:
如图所示,从摄像机中心发射射线,射线如果与敌人发生碰撞则发射一个球模拟子弹
3.实现步骤:
?(1)创建一个RayShooter脚本,附加到摄像机上
(2)RayShooter脚本内容:
shoot()方法实现:
private void shoot()
{
//_camera.enabled = false;理解GetComponent小例子
if (Input.GetMouseButtonDown(0))
{
Vector3 point = new Vector3(_camera.pixelWidth / 2, _camera.pixelHeight / 2,
0);//获取摄像机屏幕中心坐标
Ray ray = _camera.ScreenPointToRay(point);//ScreenPointToRay()返回从摄像机通过
屏幕点的光线,也就是产生一个
//ray对象,而不是Object对象
//Debug.DrawRay(ray.origin,
ray.direction * 10, Color.black);
RaycastHit hit;//RaycastHit关于射线交叉信息的包装,包括哪里交叉和与哪个对象发生
交叉
if (Physics.Raycast(ray, out hit))//Physics.Raycast():射线投射 类似于从空间中
的某个点朝特定方向发射一条光束。
//在该过程中,可以检测并报告与光束接触的任何对
象
//out关键字,使一个数据结构在命令内操作和命令
外都是同一对象而不是,
//那些在不同函数作用域中被反复复制的对象
{
GameObject hitObject = hit.transform.gameObject;//获取碰撞对象
//击中信息不会返回击中对象,而是指向所击中的Transform组件,所以可以通过
Transform来访问gameObject
//使用对象的GetComponent方法检查它是否是一个反应的目标(如果有ReactiveTarget
就是)
//GetComponent()方法返回附加到GameObject上的指定类型组件,如果对象没有添加这
个类型组件,
//则GetComponent不会返回任何东西
ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();//将碰撞
对象组件引用给
//攻击对
象:ReactiveTarget
if(target == null)//击中对象是一个反应目标,则发射小球
{
Debug.Log("啥也不是!!");
}
else
{
//Debug.Log("Hit" + hit.point);
StartCoroutine(SphereIndicator(hit.point));//运行协程需要使用
StartCoroutine()方法调用
}
}
}
}
?协程:当需要产生一些慢慢消失的物体时采用协程
private IEnumerator SphereIndicator(Vector3 pos)//球指示器,使用协程发射一个球到碰撞体上
{
GameObject sphere =
GameObject.CreatePrimitive(PrimitiveType.Sphere);//CreatePrimitive:
//创建一个具有原始网格渲染器和相应碰撞体的游戏对象。
sphere.transform.position = pos;
yield return new WaitForSeconds(10);
Destroy(sphere);
}
(3) 敌人类:
单独写一个脚本:命名为ReactiveTarget(这里注意,如果这里命名更改或是未创建都会引起报错),将其附加到enemy上,这样就能达到只射击中方块而墙壁不会被影响的效果,当然这种效果也可以使用tag。
?持续更新!感兴趣记得关注哦
|