unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)

一.使用向量原理转换到目标方向

为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向

float rotateSpeed;

//相对目标位置运动
void trackPosition02(Vector3 tarPosition)
{
Vector3 targetDir = tarPosition - transform.position;
Vector3 up = transform.up;
float angle = Vector3.Angle(targetDir, up);
if (angle <= Time.fixedDeltaTime * rotateSpeed) return;//判断角度是否小于临界值,如果小于,那么不需要旋转,此处用于避免旋转抖动
Vector3 cross = Vector3.Cross(up, targetDir);
if (cross.z > 0) transform.Rotate(new Vector3(0, 0, rotateSpeed0* Time.deltaTime)); else transform.Rotate(new Vector3(0, 0, -rotateSpeed0* Time.deltaTime));
}

可能unity提供了更简单的判定方式,知道的老兄留个评论

二.利用角度符号判断转到目标方向

这里原理和一相同,只是判断角度的方式是使用判断两者的角度差,而不是向量的叉值

float angle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
transform.Rotate(new Vector3(0, 0, Mathf.Sign(angle) * speed * Time.deltaTime));

三.有角度限制的转到目标方向

这里角度限制是指在局部坐标系内的角度限制,比如某个TD坦克,它的炮塔只能在正方向的-30度到正30度之间旋转,

但是除了计算局部旋转,还要加上父物体的旋转角度

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class RotateTest : MonoBehaviour 6{ 7 // The target marker. 8 public Transform target; 9 10 // Angular speed in radians per sec. 11 public float speed; 12 13 //Vector3.up方向为0角度方向 14 //局部坐标系内的最小角度和最大角度 15 public float minAngle; 16 public float maxAngle; 17 18 //局部坐标系内的最小角度和最大角度转换到直接坐标系的值 19 public float minAngleInWorld; 20 public float maxAngleInWorld; 21 22 void Update() 23 { 24 //父亲物体的当前角度 25 float offsetAngle = Vector3.SignedAngle(Vector3.up, transform.parent.transform.up,Vector3.forward); 26 27 minAngleInWorld = minAngle + offsetAngle; 28 maxAngleInWorld = maxAngle + offsetAngle; 29 30 //当前的目标方向相对世界坐标Up方向的角度,用于判断是否在设定的范围内 31 float angle = Vector3.SignedAngle(Vector3.up, target.position - transform.position, Vector3.forward); 32 //当前自身与目标的角度方向差,用于决定旋转方向 33 float signAngle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward); 34 if (angle > minAngleInWorld && angle < maxAngleInWorld) transform.Rotate(new Vector3(0, 0, Mathf.Sign(signAngle)*speed * Time.deltaTime)); 35 36 /* 37 float angle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward); 38 transform.Rotate(new Vector3(0, 0, Mathf.Sign(angle) * speed * Time.deltaTime)); 39 */ 40 } 41}

四.利用unity的接口旋转

1//数学意义的转到目标方向 2 protected void RotateToDir(Vector3 dir) 3 { 4 float angle = Vector3.SignedAngle(Vector3.up, dir, Vector3.forward); 5 Quaternion rotation00 = Quaternion.Euler(0, 0, angle); 6 transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation00, Time.fixedDeltaTime * computeRotateSpeed); 7 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

人工智能数学基础-线性代数1:向量的定义及向量加减法

一、向量1.1、向量定义向量也称为欧几里得向量、几何向量、矢量,指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的量叫做数量(物理学中称标量),数量(或标量)只有大小,没有方向。1.在物理学和工程学中,几何向量更常被称为矢量。2.一般印刷用黑体的小写

Unity 水、流体、波纹基础系列(三)——波浪(Waves)

目录1正弦波1.1调整顶点1.2调整Y1.3振幅1.4波长1.5速度1.6法线向量1.7Mesh分辨率1.8阴影2格斯特纳波(Gerstner)2.1来回移动2.2法线向量2.3防止循环2.4相速度3波方向3.1方向向量3.2法线向量4多重波4.1

Unity3D 键盘控制物体平面移动(操作相对于摄像机方向)

Intro目标是实现目标随摄像机方向的不同而进行不同方向移动——而且,目标不需要随摄像机一起旋转。使用摄像机的四元数旋转voidHandleKeyboardAction(){varhorizontalInput.GetAxis("Horizo

unity2D以最小的角度旋转到目标方向(y方向为角色的主方向) - HelloWorld