本节要点
1.鼠标控制手臂朝向
1.使用射线控制手臂朝向
主摄像机发射射线,与场景中的物体碰撞,获取一个碰撞点,然后手臂“朝向”
这个点。
Transform.LookAt(Vector3):朝向(面向)世界中的一个点。
2.场景背景模型添加碰撞器组件
添加 Mesh Collider 组件,使用简模进行碰撞检测。
简模模型的作用:降低物理运算资源消耗,提高游戏性能;
Vertices(verts):顶点个数,Mesh 网格是由顶点组成面,面组成体。
顶点个数越少,计算量越小。
3.控制手臂的旋转轴
手臂应该是以肩关节为轴进行旋转。
和 Unity 初级课程上部《疯狂教室》案例中旋转门的处理方式一样,新建父物
体,通过父物体控制子物体。
4.Debug 绘制测试线
枪口到碰撞点直接绘制一根测试线。
Debug.DrawLine(Vector3, Vector3, Color):绘制线
和 Debug.DrawRay()用法一样。
Transform.FindChild(string):在当前物体的子物体中查找游戏物体。
2.枪口添加激光特效
1.枪口位置添加 LineRenderer 组件
在枪口这个空游戏物体上添加 LineRenderer 组件,设置相关属性。
LineRenderer.SetPosition(int,Vector3):设置线的位置。
int:位置的索引值;
Vector3:该位置所在的坐标值;
2.从其他项目中导出资源包
选中 Project 面板中相应的资源,然后鼠标右键-->Export Package...
关键代码
Weapon
public class Weapon : MonoBehaviour {
//手臂指向鼠标点击的位置
//声明一个手臂位置的变量;
private Transform m_transform;
//利用射线去检测
//声明一个射线的变量 声明一个存贮射线信息存贮的变量
private Ray ray;
private RaycastHit hit;
//定义一个枪口位置的变量;
private Transform m_Point;
//设置特效 线渲染器属性组件 变量
private LineRenderer m_LineRenderer;
void Start () {
//将Transform 位置赋值
m_transform=gameObject.GetComponent<Transform>();
//枪口位置赋值;
// m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>();
m_Point = m_transform.FindChild("Point");
//特效渲染器组件位置赋值;关键语法 利用枪口的位置设置; 先将查找到的组件 linerenderer 存贮起来
m_LineRenderer = m_Point.gameObject.GetComponent<LineRenderer>();
}
void Update () {
//使手臂朝向鼠标点击的位置;
//接收射线的变量 利用摄像机获取射线并赋值;
ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从屏幕发射到鼠标点击的位置的射线;
//进行物理检测
if (Physics.Raycast(ray, out hit))
{
//控制手臂的方向
//检测成功后调用 游戏对象位置的 朝向 方法 lookat
m_transform.LookAt(hit.point);//参数是碰撞点
//检查是否有碰撞;
//Debug.Log("Collider");
//场景中没有任何碰撞体 或者打开场景的属性检查;所以手臂不会移动
//因此 要添加网格碰撞器 选中 游戏物体 add component 加组件 mesh Collider;
//但是默认的有4千个顶点,ui设计的只有2千顶点的简模 所以用ui的添加碰撞器
//成功测试后,发现手的旋转关节不对,就是手是手臂的中心点 可以定义一个父类来控制它 不要以为手臂的中心点来控制
//建立一个父类,把之前的代码组件移除 设置好父类坐标,将脚本挂载到父类组件去
//绘制枪口发射线
//与绘制射线方法相同 Debug.DrawRay();
// Debug.DrawLine(m_transform.position,hit.point,Color.red);//参数1: 起始位置 参数2:射线碰撞的位置 参数3:颜色;
//射线出发的位置不对 所以定义一个空物体存贮枪口的位置 transform
//怎么查找父类下的组件呢?
//gameObject.transform.Find("Point");
//如果游戏对象下面有N个叫Point的组件呢;所以我们只要查找父类下的组件名称即可;
// m_Point = gameObject.transform.FindChild("Point").GetComponent<Transform>(); // 这是赋值过程,写到Start方法即可;
//再次绘制射线;
Debug.DrawLine(m_Point.position, hit.point, Color.red);
//绘制特效线的位置;注意关键函数
m_LineRenderer.SetPosition(0,m_Point.position);//参数1:特效起始位置的下标 参数2:特效起始位置下标的位置 (枪口位置)
m_LineRenderer.SetPosition(1,hit.point);//参数1:特效结束位置的下标 参数2:特效结束位置下标的位置 (射线碰撞点)
}
}
}