不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时候就开始玩了,这款游戏控制单位角色移动是通过鼠标的点击来实现。
同样的操作方法还有英雄联盟等很多游戏,那本篇文章小编就通过简单小实例来讲解这种操作在Unity中是如何实现的。
小编先展示一下实例的演示动图:红色球体表示我们控制的角色,鼠标左键点击小球就会到相应的坐标位置并打印坐标。
一、原理
先来讲一下这种操作方式的原理:它其实是从摄像机发射出的一条射线。当鼠标点击的时候,射线就从摄像机发射打到你点击的位置,通过检测射线获取到位置坐标,角色就向这个坐标移动。
注:射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到,演示动图中点击平面区域以外的地方是没有任何反应的。
二、实现实例
创建射线的两种方法:该实例是通过摄像机创建射线
//创建射线的两种方法:
//方式一 通过向量创建
Ray ray1 = new Ray(Vector3.zero , Vector3.up);
//方式二 通过摄像机创建
Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePosition);
新建一个平面一个球体,球体挂载上红色的材质方便我们观察,新建RayTest脚本用来检测射线并挂载到球体上。
public class RayTest : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//当点击鼠标左键时执行if(Input.GetMouseButtonDown(0)){//按下鼠标左键发射射线 射线发射后碰到的游戏物体必须要有碰撞组件才会被检测到Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//声明一个碰撞信息类RaycastHit hit;//碰撞检测用布尔类型表示bool res = Physics.Raycast(ray,out hit);//如果碰撞到的情况下,hit就有内容了if (res == true){//打印出碰撞信息的坐标Debug.Log(hit.point);//把坐标赋值给球体,球体位置就会直接闪现到射线检测点transform.position = hit.point;}//多检测//RaycastHit[] hits = Physics.RaycastAll(ray, 100, 1 << 10);}}
}
点击运行就是动图的演示效果了,很简单的一个实例,拜拜┏(^0^)┛