您的位置:首页 > 移动开发 > Unity3D

unity3d学习(二)制作第一人称射击-玩家射击和添加敌人

2017-02-26 23:31 393 查看

玩家射击和添加敌人

写在前面:

- 学习课本:Unity5实战 使用c#和unity开发多平台游戏-作者:Joseph Hocking

- 内容:第三章

-接上篇:unity3d学习(一)制作第一人称射击-玩家的视口和移动

让玩家能够射击

第一步:通过射线发射
因为我们是第一人称射击,我们可以使用unity提供的ScreenPointToRay(),创建一个从摄影机开始发射的射线。一旦有了射线,它能被传入Physics.Raycast()方法中。

向摄影机添加RayShooter脚本

using UnityEngine;
using System.Collections;

public class RayShooter: MonoBehaviour
{
void Start()
{
_camera = GetComponent<Camera>();//获取相机上的Camera组件
}

void Update()
{
if(Input.GetMouseButtonDown(0))//当点击左建执行发射射线
{
Vector3 point = new Vector3(_camera.pixelWidth/2,_camera.pixelHeight/2,0);//发射位置

Ray ray = _camera.ScreenPointToRay(point);//创建射线
RayCastHit hit;//数据结构变量
if(Physics.Raycast(ray,out hit))//在此方法中寻找射线信息,并且赋值给hit变量
{
//获取射线与射击到物体的交叉位置,并且进行一些操作
//Debug.Log("Hit "+hit.point);
StartCoroutine(SphereIndicator(hit.point));//运行此协程
}
}
}

private IEnumerator SphereIndicator(Vector3 pos)//运行协程来响应击中
{
GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);//创建一个球体。
sphere.transform.position = pos;//表示击中此位置
yield return WaitForSeconds(1);//表示等待一秒再执行此函数下面的内容

Destory(sphere);
}

// 添加可视化指示器
void OnGUI()//unity会自动响应OnGUI方法。每帧之后执行
{
int size = 12;//这是准星图像的长度,减去它确保准星对准中心点
float posX = _camera.pixelWidth/2-size/4;
float posY = _camera.pixelHeight/2-size/2;
}
}


制作一个敌人

第一步:制作一个长方体作为敌人(下图左边):



并为其添加一个ReactiveTarget脚本,代码如下:

using UnityEngine;
using System.Collections;

public class ReactiveTarget: MonoBehaviour {
public void ReactToHit()//单敌人被攻击执行的操作
{
StartCoroutine(Die());
}

private IEnumerator Die()
{
this.transform.Rotate(-78,0,0);//做一些死亡的动作

yield return WaitForSeconds(1.5f);//等待几秒再执行消失

Destory(this.gameObject);
}
}


第二步:修改上面RayShooter脚本的部分代码
RayShooter脚本现在击中目标后,我们只是让它产生了一个球体,如果我们击中敌人,我们需要敌人死亡。代码修改如下

...
if(Physics.Raycast(ray,out hit))//在此方法中寻找射线信息,并且赋值给hit变量
{
GameObject hitObject = hit.transform.gameObject;//获取射线交叉的对象
//获取射线与射击到物体的交叉位置,并且进行一些操作
ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();//试着获取此对象ReactiveTarget脚本组件
if(target!=null)//如果有此组件的,说明是敌人。
{
target.ReactToHit();
}
else
{
StartCoroutine(SphereIndicator(hit.point));//运行此协程
}
}
...


总结

1、Camera.pixelWidth、Camera.pixelWidth.pixelHeight、Camera.ScreenPointToRay()。分别是摄影机的宽和高。最后一个是从摄影机发射射线

2、Physics.Raycast():记录所有射线的信息,并可以把射线信息给一个RaycastHit结构的变量

3、StartCoroutine():启动一个协程。它保持运行直到函数结束,可以在运行中暂停。参数是一个函数。

4、yield关键字:这个关键字导致协程临时暂停,在下一帧继续运行。

5、IEnumerator类型:StartCoroutine需使用。

6、OnGUI():和Start(),Update()类似。MonoBehaviour自动响应OnGUI方法。并且绘制的东西出现在3D场景最上层。

注意:很多类和方法不清楚请查看官方文档
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d unity c# 游戏