unity旋转物体的操作

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

1.在限制的角度范围内进行旋转(或旋转到某个角度)

        例如绕物体的Z轴在-40°~40°之间进行旋转

float max_rotation = 40f;
float min_rotation = -40f;
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
 
Vector3 vector3 = transform.rotation.eulerAngles;
vector3.z -= horizontal * 150f * Time.deltaTime;
vector3.z = (vector3.z + 180f) % 360f - 180f;//将引擎中传入的角度规范化到-180°~180°
vector3.z = Mathf.Clamp(vector3.z, horizontal * min_rotation, -horizontal *        max_rotation);//保持vector3.z在min°~max°之间
transform.rotation = Quaternion.Euler(vector3);

注意!!!
Unity引擎中使用的欧拉角范围在0°~360°
而脚本中的角度的范围却没有这个限制
若脚本中的角度在这个范围外,Unity会在引擎内把该角度转换在这个范围内

所以当脚本中角度为**负数**或**超过**360°**时会转换为0°~360°中对应的角度

例如 在脚本执行完0° - 100°后角度为 (-)100°,但进入引擎后这个角度时就会被转换为(+)260°
若脚本从引擎中重新读取这个角度那么值也会变为(+)260°

脚本执行完0°- 400°后角度为(-)400°,但进入引擎后这个角度时就会被转换为(+)320°,若脚本从引擎中重新读取这个角度那么值也会变为(+)320°

可以使用角度规范化,将引擎中的角度规范化来规避这个问题
例如规范到-180°~180°:

vector3.z = (vector3.z + 180f) % 360f - 180f;

在开头的代码中我想让游戏物体绕Z轴在-40°到+40°之间旋转,但是因为一旦角度小于0°。引擎就会将其转换到0°~360°之间,那么角度将永远也不会小于-40°,导致无法在脚本中判断。
而在角度规范化到-180°~180°后
例如角度转到-50°,引擎中将其转换为310°,脚本接收310°后执行:310°+180°) % 360° - 180° = -50°
将其规范为-50°以此程序可以正常判断

 2.旋转指定角度

方法一: 直接干

例如绕物体Z轴旋转360°

//正转情形
 Vector3 vector3 = transform.rotation.eulerAngles;
 vector3.z += 450f * Time.deltaTime;
 if (vector3.z >= 360f)//
 {
     vector3.z = 0f;
 }
 transform.rotation = Quaternion.Euler(vector3);
//反转情形
 Vector3 vector3 = transform.rotation.eulerAngles;
 vector3.z -= 450f * Time.deltaTime;
 if (vector3.z <= 0f)
 {
     vector3.z = 0f;
 }
 transform.rotation = Quaternion.Euler(vector3);

正转时可以理解物体转到或转过360°时我们将其复原
那么反转时为旋转一周的判断条件为什么是小于0呢
前面说过Unity引擎中使用的欧拉角范围在0°~360°
那么假设第一帧物体转了-40°,那么进入到引擎中角度就会被转换成320°
所以物体在旋转过程中的角度变化为0°→-40°(脚本中)→320°(引擎中)→320°(脚本中)→······→0°(脚本和引擎中,此时已经旋转完一周)→-X°(脚本中,X>0)→(360-X)°(引擎中)
所以当脚本中的角度第二次变为负数时物体就已经旋转一周了。

方法二: 巧用计数器(推荐使用)

我们可以专门设置一个变量来记录已经旋转的角度,等旋转角度达到预期角度时停止旋转
这样我们就可以不必考虑角度的转换问题了nice~

private float rotateCount = 0f;

void rotating()
{
  Vector3 vector3 = transform.rotation.eulerAngles;
  vector3.z += 450f * Time.deltaTime;
  rotateCount += 450 * Time.deltaTime;
 
  if (rotateCount >= 360)
  {
      vector3.z = 0f;
      rotateCount = 0;
  }
  transform.rotation = Quaternion.Euler(vector3);
}

3.注意事项


在旋转完物体后,物体的局部坐标轴也会旋转
我们在使用某些方法移动物体时要注意局部坐标轴的变化
例如下面例子

我在玩家控制脚本中按空格生成了子弹

if(Input.GetKeyDown(KeyCode.Space))
{
    Instantiate(Bullet, firePoint.position, Bullet.transform.rotation);
}

并在子弹控制脚本中控制前进

void Update()
{
    transform.Translate(Vector3.forward * 10f * Time.deltaTime);
}

我预期是想让子弹朝着Z轴方向移动
但实际发现子弹却朝着Y轴方向移动
这是因为在生成子弹时我令其在X轴方向上旋转了90°
这就使Y轴替换了原来Z轴的位置
物体沿Y轴移动

在修正前进方向后恢复正常文章来源地址https://www.toymoban.com/news/detail-793815.html

void Update()
{
    transform.Translate(Vector3.up * 10f * Time.deltaTime);
}

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

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

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

相关文章

  • Unity 物体旋转

          在Unity中经常会用到物体的旋转,常用的方式一般是使用欧拉角和四元数。 欧拉角: Demo:    让物体分别绕x,y,z轴旋转 1 rad。    这里有个问题,当物体绕x轴旋转90度之后,再让y或z轴继续旋转,会发现,物体只能绕   y轴旋转。出现这种现象的原因是死锁了。欧拉角

    2024年02月13日
    浏览(29)
  • unity---物体旋转

    目录   1.旋转的三种方式 2.为Transform.rotation赋值  3.使用Transform.Rotate函数 4. 使用Quaternion.RotateTowards函数  5.使用Transform.LookAt函数 6. Transform.RotateAround 围绕旋转  7.Quaternion.LookRotation 注视旋转  8.Quaternion.FromToRotation 从from到to旋转  9.坑   1.旋转的三种方式 1、矩阵旋转 2、欧拉

    2024年02月07日
    浏览(28)
  • Unity 物体的朝向与旋转

    方式一 立即转向:朝向某个方向 方式二 立即转向:看向某个点 方式三 立即转向:与方式一类似,朝向某个方向 方式四 DoTween旋转动画,需要提前知道旋转的角度 方式五 匀速旋转,需要实时计算自己的位置与目标位置之间的四元素 方式六 非匀速旋转,一般用于人物旋转

    2024年02月02日
    浏览(25)
  • Unity 鼠标拖动旋转物体,并且物体不会越转越乱

    用Mathf.Abs(绝对值)计算鼠标水平和竖直方向谁的位移更大,减少因为一丢丢的其他方向移动导致的物体微幅旋转影响后面物体旋转会越来越混乱。这样可以让物体旋转更好的单个方向进行旋转。 代码如下:

    2024年02月15日
    浏览(31)
  • Unity 四元数与物体旋转

    由三个角度(x,y,z)组成 在特定坐标系下用于描述物体的旋转量 空间中的任意旋转都可以分解成绕三个互相垂直轴的三个旋转角组成的序列 欧拉角旋转约定——heading-pitch-bank 这是一种最常用的旋转序列约定——Y-X-Z约定 heading:物体绕自身的对象坐标系的Y轴旋转的角度 pitch:物体

    2024年01月18日
    浏览(45)
  • 【Unity入门】11.脚本控制物体旋转

        大家好,我是Lampard~~     欢迎来到Unity入门系列博客,所学知识来自B站阿发老师~感谢 (1)创建RotateLogic脚本     上一篇文章我们学习了如何在脚本中获取物体对象,并使用transform组件下的translate接口使物体运动     今天我们进一步学习,用脚本控制物体的旋转。首先

    2024年02月04日
    浏览(33)
  • unity物体旋转:RigidBody.AddTorque

    在Unity中让物体旋转的方法有很多,但是如果想让物体旋转得像现实一样有平滑的加速减速惯性那么用AddTorque是一个很好的选择。 Rigidbody.AddTorque方法在2D和3D中都有该方法,但是不太一样,在官方文档中的描述是Rigidbody.AddTorque向刚体添加扭矩,而Rigidbody2D.AddTorque则是在刚体的

    2024年02月12日
    浏览(26)
  • unity使物体运行时自动旋转

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class jiaobeng : MonoBehaviour {     public float speed = 80f;     // Update is called once per frame     void Update () {         transform.Rotate(Vector3.up * Time.deltaTime * speed);     } } 需要将脚本挂在需要自动旋转的物体component上即可运行

    2024年02月12日
    浏览(33)
  • Unity实现物体绕指定轴旋转

    在Unity中,我们经常需要控制物体的旋转行为。有时候,我们需要让物体绕指定的轴旋转,而不是默认的旋转轴。在本文章中,我将展示如何使用C#脚本来实现这个功能。 首先,我们需要创建一个空对象,并将它作为父对象,然后将我们想要旋转的物体作为子对象。这样,我

    2024年01月23日
    浏览(35)
  • Unity- 控制物体旋转、移动、缩放的功能

    本文章主要介绍Unity中控制物体旋转、移动、缩放的方法~ 旋转: (一)控制物体自转 (二)控制物体A绕着物体B转 脚本放在物体A上,再将物体B拖到脚本相应位置上 移动: 物体不断向前移动  扩展:使用键盘(上下左右箭头)控制物体前后左右移动 缩放: ① 物体放大一倍

    2024年02月08日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包