栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

【Unity3D Debug】“CharacterController.Move()在处理角色移动时,角色不论怎么转向其移动方向始终不变”的解决方案

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Unity3D Debug】“CharacterController.Move()在处理角色移动时,角色不论怎么转向其移动方向始终不变”的解决方案

【Unity3D Debug】CharacterController.Move在处理角色移动时,角色不论怎么转向其移动方向始终不变的解决方案

这是笔者在处理FPS角色的移动逻辑时遇到的问题。

举个例子,我现在想通过角色控制器(Character Controller)组件,让角色朝着moveDir的方向移动(其中moveDir的方向是相对于角色的transform.forward而言的),代码如下所示:

void Update(){
	//...
	float speed = 5f; // 移动速度
	Vector3 v = moveDir; // moveDir为归一化方向向量(Vector3)
	cc.Move(v * speed * Time.deltaTime);
	//...
}

这段代码看似正常,但如果给角色加入绕y轴的旋转后会发现,角色始终是朝着固定的一个方向运动。比如按下W键向前走,但是不论你如何转向,它都始终朝着Vector3.forward方向运动,这显然是有问题的。

究其原因,CharacterController.Move(Vector3 motion)方法传入的Vector3向量会被视为世界坐标系下的移动向量,而非局部坐标系。moveDir是相对于角色正面朝向的方向向量,即角色坐标系下的局部方向。

因此,一种解决方案是将moveDir从局部坐标系转变为世界坐标系下的对应向量,借助函数transform.TransformDirection,作修改后的代码如下所示。

void Update(){
	//...
	float speed = 5f; // 移动速度
	Vector3 v = transform.TransformDirection(moveDir); // moveDir为归一化方向向量(Vector3)
	cc.Move(v * speed * Time.deltaTime);
	//...
}

这样,纵使存在绕Y轴的旋转,我们也始终能保证角色朝着预期的方向前进。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/898056.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号