【Unity】常见对象旋转方法

这篇具有很好参考价值的文章主要介绍了【Unity】常见对象旋转方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 前言

        记录下常见的游戏对象旋转API。

2 旋转API

2.1 Transform.Rotate

        自身旋转。

public void Rotate(Vector3 eulers, Space relativeTo = Space.Self);

  • eulers:旋转角度。

  • relativeTo:坐标轴。

代码:

using UnityEngine;

public class _Rotation : MonoBehaviour
{
    void Update()
    {
        //以世界坐标轴,旋转y轴
        this.transform.Rotate(new Vector3(0, 0.1f, 0), Space.World);
    }
}

演示:

【Unity】常见对象旋转方法,Unity,unity,游戏引擎

代码:

using UnityEngine;

public class _Rotation : MonoBehaviour
{
    void Update()
    {
        //以自身坐标轴,旋转y轴
        this.transform.Rotate(new Vector3(0, 0.1f, 0), Space.Self);
    }
}

演示:

【Unity】常见对象旋转方法,Unity,unity,游戏引擎

2.2 Transform.RotateAround

        绕某一点的某轴旋转。

public void RotateAround(Vector3 point, Vector3 axis, float angle);

  • point:旋转中心点。(绕谁旋转)

  • axis:旋转轴。(中心点的轴)

  • angle:旋转角度。

代码:

using UnityEngine;

public class _Rotation : MonoBehaviour
{
    public GameObject Center;
    void Update()
    {
        //以自己为中心点,绕世界y轴旋转,每秒30度。
        //this.transform.RotateAround(this.transform.localPosition, Vector3.up, 30.0f * Time.deltaTime);
        //以自己为中心点,绕自身y轴旋转,每秒30度。
        //this.transform.RotateAround(this.transform.localPosition, this.transform.up, 30.0f * Time.deltaTime);

        //以Center为中心点,绕Center自身z轴旋转,每秒30度。
        this.transform.RotateAround(Center.transform.localPosition, Center.transform.forward, 30.0f * Time.deltaTime);
    }
}

演示:

【Unity】常见对象旋转方法,Unity,unity,游戏引擎

图中,长条矩形是Center,蓝色轴是z轴。

2.3 Quaternion.RotateTowards

        四元数计算,从某一角度转到某一角度。 ​ 使用四元数不会出现万向锁问题,具体四元数角度与Vector角度的区别可自行查询,在旋转效果上基本没什么区别。

public static Quaternion RotateTowards(Quaternion from, Quaternion to, float maxDegreesDelta);

  • from:当前角度。(四元数形式的角度)

  • to:目标角度(四元数形式的角度)

  • maxDegreesDelta:每次执行时的最大旋转角度。

代码:

using UnityEngine;

public class _Rotation : MonoBehaviour
{
    //选择最终角度
    Quaternion qua;

    void Start()
    {
        //确定好旋转的最终角度,在当前坐标系y轴上加200度。然后将欧拉角转为四元数。
        qua = Quaternion.Euler(this.transform.localEulerAngles + new Vector3(0, 200, 0));
    }

    private void Update()
    {
        //从当前角度往目标角度旋转,每次旋转的最大值为30.0f * Time.deltaTime,基本除了最后一次旋转,前面的每次旋转都是这个值,因为最后一次到达目标角度所需要旋转的角度可能小于30.0f * Time.deltaTime。
        this.transform.localRotation = Quaternion.RotateTowards(this.transform.localRotation, qua, 30.0f * Time.deltaTime);
    }
}

演示:

【Unity】常见对象旋转方法,Unity,unity,游戏引擎

可以看到,箭头旋转了大概200度。

        但同时我们也发现了一个问题,在定最终位置时设置的是y轴加200度,那这里应该是顺时针旋转呀,怎么是逆时针呢?这是因为此函数在旋转时,每次都会走最小角度,这一点很重要,在实际应用时是会影响到功能开发的。有个特例:那么180度和-180度怎么旋转,答案是:180逆时针,-180度顺时针,哎就是反着玩。
        还有我们对对象的transform中的旋转x、y、z进行修改,实际旋转是绕坐标轴的x、y、z,而不是对象本身的x、y、z。Inspector面板里Transform中的信息显示的是局部信息,我们可以尝试手动修改,就会发现其是绕局部坐标轴的三轴旋转。代码里我是都是用的local角度,所以这里是绕自身所在局部坐标系三轴旋转。当然,案例中目前箭头模型没有父级,所以其局部坐标系就是世界坐标系。我们可以看到箭头是以世界坐标系的y轴旋转的,这是因为目前世界坐标系就是我们的局部坐标系。在代码中我们增加了y值,所以是以局部坐标系(这里就是世界)的y轴旋转了200度来定最终角度的,结果就是图中是以世界坐标轴的y轴来旋转的。
        额,还有一点,绕最小角度旋转到目标角度,在Inspector面板中,x、y、z的变化是按实际旋转来变化。比如我们初始Rotation y是0,然后代码里加200来旋转,是不是应该旋转到200?错,因为我们走最小角度,所以逆时针旋转,然后角度就从0变化到-160度,-160和200度位置相同,差一圈。但实际上,Inspector面板中Transform组件里的Rotation显示的不是真正的欧拉角,我们在Inspector面板上设置的Rotation的欧拉角值在运行后debug出来的都是在[0,360)内,Unity会调整它。这里的-160就不是欧拉角真正的值,输出的话会发现是200度,角度变化过程是从一个接近360的角度→200。局部、世界欧拉角都是如此。但需要知道的是,本身这个旋转函数Quaternion.RotateTowards是使用四元数旋转的,四元素角度是区分正负的。

PS:另外也可以实现箭头的无限旋转,在Update里一直更新目标角度就行了,这就不演示了,很基础的思路。

2.4 Vector3.RotateTowards

        从某一角度转到某一角度。

public static Vector3 RotateTowards(Vector3 current, Vector3 target, float maxRadiansDelta, float maxMagnitudeDelta);

  • current:当前角度。

  • target:目标角度。

  • maxRadiansDelta:每次执行时允许旋转的最大角度。

  • maxMagnitudeDelta:此旋转所允许的矢量大小的最大变化。(希望返回的方向向量长度,最大有效值为目标方向向量(target)的长度,传0将返回单位向量长度)(前面是我看别人的解释说是长度,但我也不确定这到底是个什么)

代码:

using UnityEngine;

public class _Rotation : MonoBehaviour
{
    //选择最终角度
    Vector3 vc;

    void Start()
    {
        //确定好旋转的最终角度,在当前y轴上加200度
        vc = this.transform.localEulerAngles + new Vector3(0, 200, 0);
    }

    private void Update()
    {
        //从当前角度往目标角度旋转,每次旋转的最大值为30.0f * Time.deltaTime,基本除了最后一次旋转,前面的每次旋转都是这个值
        this.transform.localEulerAngles = Vector3.RotateTowards(this.transform.localEulerAngles, vc, 30.0f * Time.deltaTime, 10);
    }
}

演示:

【Unity】常见对象旋转方法,Unity,unity,游戏引擎

跟Quaternion.RotateTowards类似,但不如其好用,而且最终角度设置不好还会造成不停胡乱旋转的情况,不好用。

        另外,在旋转前,Inspector不是以Inspector面板中的欧拉角,是以调整后在[0,360)的欧拉角旋转。比如初始y设置-5度,目标设为200度,那么在运行时实际就是从335→200的旋转,会逆时针。另外输入的角度值应在[0,360)范围内(在代码中设置为负角度的话,就会以负值输入),否则会胡乱旋转。
        总结一下就是,旋转时自身欧拉角会被定到[0,360)内,所定的最终目标角度值也应在[0,360)内(否则会胡乱旋转),然后就是从当前角度往目标角度旋转,这样以来实际就是在两个[0,360)范围内的角度之间旋转,这样一看,此API的旋转过程就比较清晰了。

3 结束语

        后续根据情况再补充,一般情况下,本文前三个旋转操作就能满足大部分需求了。Quaternion.RotateTowards是真滴好用!是真滴好用!是真滴好用!只需要给出起始四元数角度和终点四元数角度就好,完全不担心出问题,就是其只走小角度的问题有时候会影响使用,不过这种情况选Transform.Rotate就好,是最简单的方法也正因此可塑性、灵活性很强。文章来源地址https://www.toymoban.com/news/detail-802240.html

到了这里,关于【Unity】常见对象旋转方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】常见的角色移动旋转

      在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式: 欧拉角(Euler Angles) :欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Unity中,可以通过修改物体的 transform.eulerAngles 属性来进行欧拉

    2024年02月10日
    浏览(43)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(77)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(74)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(64)
  • Unity--随机生成游戏对象

    在脚本中声明数组 RandomObjects 用于保存生成对象的类型,在project文件中拖入对象。 先将脚本拖到一个对象上,然后点击检查器-覆盖-应用到全部,这样将使所有预制件都拥有该属性。

    2024年02月15日
    浏览(40)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(94)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(71)
  • 【Unity3D】游戏物体操作 ③ ( 旋转操作 | 旋转工具 | 基本旋转 | 设置旋转属性 | 增量旋转 | 缩放操作 | 轴向缩放 | 整体缩放 | 操作工具切换 | 操作模式切换 )

    选中 Scene 场景 中的 游戏物体 GameObject , 点击 工具栏 中的 转换工具 , 此时在该 游戏物体 会被 4 个 圆圈 环绕 ; 红圈 : 拖动该圈 , 绕 X 轴旋转 ; 绿圈 : 拖动该圈 , 绕 Y 轴旋转 ; 蓝圈 : 拖动该圈 , 绕 Z 轴旋转 ; 最外层还有一个 白圈 ; 鼠标左键按住旋转 : 在 Unity 旋转 游戏物体

    2023年04月08日
    浏览(68)
  • Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(123)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包