unity unity3d 2d人物行走走指针闪怎么回事

实现思路:鼠标点击,产生目标点,计算角色和目标点的夹角,旋转角色朝向目标点,然后移动角色。看到很多人浏览了这篇博文 ,有人建议写点注释,我就简单注释一下。
1 void Update ()
if(Input.GetMouseButtonDown(0))
RayControl();
if(flagMove)
if(Vector3.Distance(transform.position,mousePos)&1)
transform.Translate(transform.worldToLocalMatrix* transform.forward * Time.deltaTime*5);//transform.forward是世界坐标,通过transform.worldToLocalMatrix转换矩阵转到本地坐标然后在本地坐标运动,没有必要必须在本地坐标系运动 但是必须注意要统一起来。
flagMove=false;
19 void RayControl()
Ray ray=Camera.main.ScreenPointToRay
(Input.mousePosition);//向屏幕发射一条射线
if(Physics.Raycast(ray,out hit,200))射线长度为200 和地面的碰撞盒做检测
GameObject targetPos=GameObject.CreatePrimitive(PrimitiveType.Sphere);//实例化一个Sphere
targetPos.transform.localScale=new Vector3(0.5f,0.5f,0.5f);
mousePos=hit.//获取碰撞点坐标
mousePos.y=transform.position.y;
targetPos.transform.position=mouseP//Sphere放到鼠标点击的地方
targetDir=mousePos-transform.//计算出朝向
Vector3 tempDir=Vector3.Cross(transform.forward,targetDir.normalized);//用叉乘判断两个向量是否同方向
float dotValue=Vector3.Dot(transform.forward,targetDir.normalized);//点乘计算两个向量的夹角,及角色和目标点的夹角
float angle=Mathf.Acos(dotValue)*Mathf.Rad2D
if(tempDir.y&0)//这块 说明两个向量方向相反,这个判断用来确定假如两个之间夹角30度 到底是顺时 还是逆时针旋转。
angle=angle*(-1);
print(tempDir.y);
print("2:"+angle);
transform.RotateAround(transform.position,Vector3.up,angle);
flagMove=true;
注意事项:写完了才发现原来没必要这么麻烦,这样transform.forward=(mousePos-transform.position).normalized 就可以直接让角色朝向目标点 RayControl函数 好多都可以省了
阅读(...) 评论()Unity人物行走卡顿,和方向问题_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
Unity人物行走卡顿,和方向问题
float x = Input.GetAxis (&Mouse X&);
float Eul = x * M_Speed * Time.deltaT
this.transform.Rotate (0, Eul, 0);
float Speed = (Mathf.Abs (v) & 0.1 ? 1.0f:0.0f);
Vector3 forw = this.transform.
forw.y = 0;
forw = f...
我有更好的答案
0.1 .0f)? 1.0f:0float Speed = (Mathf.Abs (v) &gt
确保你这段代码在Update()中每帧都执行
采纳率:83%
来自团队:
为您推荐:
其他类似问题
人物行走的相关知识
等待您来回答[Unity3D]Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现 - 推酷
[Unity3D]Unity3D游戏开发之史上最简单的鼠标点击控制人物走动实现
大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是
今天呢,我们来一起实现一个在RPG中游戏中十分常见的功能,通过鼠标点击屏幕来控制人物的走动。首先来说一下原理,当我们点击屏幕时,我们按照一定的方法,将屏幕上的二维坐标转化为三维坐标,然后我们从摄像机位置发射 一条经过该点的射线,则这条射线与大地平面的交点,就是我们的目标位置。那么确定了这个位置以后,我们需要做的就是让角色从原来的位置移动到这个位置,并在其间添加角色动画即可。对于角色移动的问题,如果复杂点的画我们可能要计算移动的方向向量,并针对起点和终点进行插值计算来实现,这里我们选择一种相对简单的办法,在Unity3D中,有一个LookAt()方法,该方法可以使物体发生旋转,使其z轴始终指向目标物体。再完成了旋转后,我们需要让物体沿着Z轴方向(forward)移动。这样就实现了鼠标点击控制人物走动这一功能。好了,下面我们来一起看今天的内容吧!
首先创建一个场景,我们准备一个地形Terrain和平行光Direction Light,并拖入我们事先准备好的人物模型,如图:
接下来为模型添加动画组件,并将动画的类型设置为Legacy模式,如图所示:
我们设置默认的动画为idle,接下来,我们来编写脚本代码:
using UnityE
using System.C
public class PeopleControl : MonoBehaviour {
//目标点坐标
private Vector3 mTargetP
void Start ()
void Update ()
//按下鼠标右键时
if(Input.GetMouseButton(1))
//获取屏幕坐标
Vector3 mScreenPos=Input.mouseP
//定义射线
Ray mRay=Camera.main.ScreenPointToRay(mScreenPos);
RaycastHit mH
//判断射线是否击中地面
if(Physics.Raycast(mRay,out mHit))
if(mHit.collider.gameObject.tag==&Terrain&)
//获取目标坐标
mTargetPos=mHit.
//让主角面朝目标坐标并向目标移动
transform.LookAt(mTargetPos);
//播放奔跑动画
transform.gameObject.GetComponent&Animation&().Play(&run&);
transform.Translate(Vector3.forward * 0.5F);
//松开鼠标右键时
if(Input.GetMouseButtonUp(1))
transform.gameObject.GetComponent&Animation&().Play(&idle&);
} 将脚本绑定到角色上以后,我们就能看到下面的效果啦,哈哈:)
这就是今天的内容啦,当然我们还需要解决的问题还有如何在控制人物走动的时候避免和其它物体发生碰撞,以及后续的优化问题,这些内容我们会在后面的文章中为大家解答,谢谢大家!喜欢我请记住我的名字:秦元培,我的博客地址是:
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致

我要回帖

更多关于 unity 鼠标指针 的文章

 

随机推荐