unity transform_【Unity游戏开发】角色转向学习

前言

在写行为树的时候,有个转向节点,控制的行为就是控制自身向指定点转向
但是在写的时候,对一些概念很不理解,就自己写了个demo场景学习一下

v2-8596105189b326b5df50f6957c7a62b3_b.jpg

这个测试场景想要实现的很简单,就是把这个箭头转向绿色的目标点。

在写这个测试demo的时候顺便实践了一下一直死记硬背的点积和叉积,

  • 简单的说: 点乘判断角度,叉乘判断方向。
  • 形象的说: 当一个敌人在你身后的时候,
  • 点乘得到你当前的面朝向的方向你到敌人的方向的所成的角度大小
  • 叉乘可以判断你是往左转还是往右转更好的转向敌人

一、计算你到敌人的方向的所成的角度大小

方法①:Vector2.Angle

float angle = Vector2.Angle(targetForward, sourceForward);

方法②:使用点积

// 计算 a、b 单位向量的点积,得到夹角余弦值,|a.normalized|*|b.normalized|=1; 

二、往左转还是往右转更好的转向敌人

//叉积算出方向 unity是左手坐标系,所以反过来了

具体解释见:Unity中点乘和叉乘的原理及使用方法

三、旋转方式 二维坐标系中的向量旋转公式

方法①:用2维向量旋转(逆时针旋转公式)进行旋转,顺时针角度为负,逆时针角度为正

private 

方法②:Quaternion.LookRotation

public 

参考:【Unity3d】平滑旋转、转向的实现

具体的demo场景已上传github:2d旋转测试DEMO场景 测试脚本

参考

Unity中角度与弧度相互转换

Unity--向量点乘叉乘在Unity中的使用

Unity中,判断角色转向是否过大通常是为了防止角色突然急剧改变方向,导致游戏体验变差。你可以通过计算当前转向的角度变化和最大允许的转向角度限制来实现这个功能。以下是一个简单的示例代码: ```csharp public class CharacterController : MonoBehaviour { public float maxTurnAngle = 45f; // 最大允许的转向角,可以根据需要调整 private Vector3 desiredDirection; private Quaternion targetRotation; void Update() { // 获取玩家输入的方向向量 desiredDirection = transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal"); // 计算目标旋转 targetRotation = Quaternion.LookRotation(desiredDirection); // 转换到弧度制并计算差异 float currentRotation = Mathf.Deg2Rad(transform.eulerAngles.z); float rotationDifference = Mathf.DeltaAngle(currentRotation, Mathf.Acos(targetRotation.x)); // 判断转向是否超过最大允许值 if (Mathf.Abs(rotationDifference) > maxTurnAngle) { // 这里可以设置平滑转向、渐进转向或其他处理方式 rotationDifference = Mathf.Sign(rotationDifference) * maxTurnAngle; } // 设置新旋转 transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, currentRotation + rotationDifference), Time.deltaTime * 5); // 使用Lerp进行平滑过渡 } } ``` 在这个例子中,我们首先获取了玩家输入的方向,并将其转换为目标旋转。然后计算实际旋转与目标旋转之间的差异,如果超过了最大允许值,就对差异取绝对值并限制在最大范围内。最后使用`Quaternion.Lerp`进行平滑地旋转更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值