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

Wesley13
• 阅读 905

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

为了让角色的自身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度之间旋转,

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateTest : MonoBehaviour
{
    // The target marker.
    public Transform target;

    // Angular speed in radians per sec.
    public float speed;

    //Vector3.up方向为0角度方向
    //局部坐标系内的最小角度和最大角度
    public float minAngle;
    public float maxAngle;

    //局部坐标系内的最小角度和最大角度转换到直接坐标系的值
    public float minAngleInWorld;
    public float maxAngleInWorld;

    void Update()
    {
        //父亲物体的当前角度
        float offsetAngle = Vector3.SignedAngle(Vector3.up, transform.parent.transform.up,Vector3.forward);

        minAngleInWorld = minAngle + offsetAngle;
        maxAngleInWorld = maxAngle + offsetAngle;

        //当前的目标方向相对世界坐标Up方向的角度,用于判断是否在设定的范围内
        float angle = Vector3.SignedAngle(Vector3.up, target.position - transform.position, Vector3.forward);
        //当前自身与目标的角度方向差,用于决定旋转方向
        float signAngle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
        if (angle > minAngleInWorld && angle < maxAngleInWorld) transform.Rotate(new Vector3(0, 0, Mathf.Sign(signAngle)*speed * Time.deltaTime));
        
        /*
        float angle = Vector3.SignedAngle(transform.up, target.position - transform.position, Vector3.forward);
        transform.Rotate(new Vector3(0, 0, Mathf.Sign(angle) * speed * Time.deltaTime));
        */
    }
}

四.利用unity的接口旋转

//数学意义的转到目标方向
    protected void RotateToDir(Vector3 dir)
    {
        float angle = Vector3.SignedAngle(Vector3.up, dir, Vector3.forward);
        Quaternion rotation00 = Quaternion.Euler(0, 0, angle);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation00, Time.fixedDeltaTime * computeRotateSpeed);
    }
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Karen110 Karen110
2年前
人工智能数学基础-线性代数1:向量的定义及向量加减法
一、向量1.1、向量定义向量也称为欧几里得向量、几何向量、矢量,指具有大小(magnitude)和方向的量。它可以形象化地表示为带箭头的线段。箭头所指:代表向量的方向;线段长度:代表向量的大小。与向量对应的量叫做数量(物理学中称标量),数量(或标量)只有大小,没有方向。1.在物理学和工程学中,几何向量更常被称为矢量。2.一般印刷用黑体的小写
Wesley13 Wesley13
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
Wesley13 Wesley13
2年前
Unity3D 键盘控制物体平面移动(操作相对于摄像机方向)
Intro目标是实现目标随摄像机方向的不同而进行不同方向移动——而且,目标不需要随摄像机一起旋转。使用摄像机的四元数旋转voidHandleKeyboardAction(){varhorizontalInput.GetAxis("Horizo
Wesley13 Wesley13
2年前
PHP程序员的技术成长规划 第三阶段:高级阶段
第三阶段:高级阶段(高级PHP程序员)重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习。(纵深维度发展)目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术问题,并且可以独立设计完成中大型的系统设计和开发工作;自己能够独立hold深入某个技术方向,在这块比较专业。(比如在MySQL、Ngi
Wesley13 Wesley13
2年前
unity2D 船只型物体驱动的实现
船只向前行驶的驱动力假设在水中没有摩擦阻力,船只有惯性,船只可以转弯,按下前进键时船只会在力的作用下使得自身的物理运动方向变化到自身的前方方向,从而向前行进。!(https://img2018.cnblogs.com/blog/1463614/201903/1463614201903052025300001810669056.
Stella981 Stella981
2年前
Flutter布局4
Row简介mainAxisAlignment:主轴布局方式,row主轴方向是水平方向crossAxisAlignment:交叉轴的布局方式,对于row来说就是垂直方向的布局方式
Wesley13 Wesley13
2年前
Unity2D 面向目标方向
在2d空间上,假设角色的自身的y轴方向为正方向,如果要让角色随时面向一个目标点。这里假设(0,0)点为目标点第一种:Vector3vVector3.zerotransform.position;                //首先获得目标方向v.z0;         
Wesley13 Wesley13
2年前
Canvas笔画向量交互动画效果,随着鼠标描绘轨迹
!Canvas笔画向量交互动画效果,随着鼠标描绘轨迹(http://static.oschina.net/uploads/img/201403/22152543_6VxR.jpg)今天为大家介绍的是一个挺有趣的交互动画。用户可通过鼠标移动来复刻鼠标的轨迹。用户可长按鼠标左键,然后向某方向快速滑动,之前描绘出的路径会随着滑动的方向而进行旋转
京东云开发者 京东云开发者
9个月前
助力618-Y的混沌实践之路 | 京东云技术团队
近三年,京东混沌工程作为大促三道防线之一,在促前扮演了非常重要的角色,而Y的混沌实践,也在不断地进行升级,主要从应用覆盖率和场景覆盖率两个方向明确提升方向,并在集团混沌大赛上取得了一系列突破和成绩。