Unity 中绕某个物体旋转方法
Published in:2023-02-22 |
Words: 966 | Reading time: 4min | reading:

Unity 中绕某个物体旋转方法

简介

  • 旋转主要是用以下方法:
    • Transform.Rotate
    • Transform.RotateAround

使用方法描述

Transform.Rotate

  • 描述

    • 世界轴旋转使用 Scene 的坐标系,因此在开始旋转 GameObject 时,它的 x、y 和 z 轴与 x、y 和 z 世界轴对齐。所以,如果在世界空间中旋转一个立方体,它的轴就会与世界对齐。在 Unity 编辑器的 Scene 视图中选中一个立方体时,将显示左 Gizmos 下以及正向/反向旋转轴的旋转 Gizmos。移动这些 Gizmos 将使立方体绕轴旋转。如果取消选择然后重新选择该立方体,这些轴将重新开始在世界中对齐。

    • 本地旋转使用 GameObject 本身的坐标系。因此,新建的立方体将使用设置为零旋转的 x、y 和 z 轴。旋转该立方体将更新旋转轴。如果取消选择然后重新选择该立方体,将按之前的相同方向显示这些轴。

  • 例如

1
public void Rotate (Vector3 eulers, Space relativeTo= Space.Self);
  • 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
using UnityEngine;

// Transform.Rotate example
//
// This script creates two different cubes: one red which is rotated using Space.Self; one green which is rotated using Space.World.
// Add it onto any GameObject in a scene and hit play to see it run. The rotation is controlled using xAngle, yAngle and zAngle, modifiable on the inspector.

public class ExampleScript : MonoBehaviour
{
public float xAngle, yAngle, zAngle;

private GameObject cube1, cube2;

void Awake()
{
cube1 = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube1.transform.position = new Vector3(0.75f, 0.0f, 0.0f);
cube1.transform.Rotate(90.0f, 0.0f, 0.0f, Space.Self);
cube1.GetComponent<Renderer>().material.color = Color.red;
cube1.name = "Self";

cube2 = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube2.transform.position = new Vector3(-0.75f, 0.0f, 0.0f);
cube2.transform.Rotate(90.0f, 0.0f, 0.0f, Space.World);
cube2.GetComponent<Renderer>().material.color = Color.green;
cube2.name = "World";
}

void Update()
{
cube1.transform.Rotate(xAngle, yAngle, zAngle, Space.Self);
cube2.transform.Rotate(xAngle, yAngle, zAngle, Space.World);
}
}

Transform.RotateAround

  • 描述
    • 将变换围绕穿过世界坐标中的 point 的 axis 旋转 angle 度。
  • 参数
    1
    public void RotateAround (Vector3 point, Vector3 axis, float angle);
  • 参数详解
    • point: 目标坐标点
    • axis: 旋转轴,如:new Vector3(1,0,0)为绕 x 轴旋转。
    • angle: 需旋转角度的变量(增量或减量)
  • 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using UnityEngine;

//Attach this script to a GameObject to rotate around the target position.
public class Example : MonoBehaviour
{
//Assign a GameObject in the Inspector to rotate around
public GameObject target;

void Update()
{
// Spin the object around the target at 20 degrees/second.
transform.RotateAround(target.transform.position, Vector3.up, 20 * Time.deltaTime);
}
}

实际应用

  • 代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#region 参数
// 相机调整角度倍速
[Header("相机调整角度倍速")]
public int speed = 1;
// 坐标
public Vector3 vect;

[Header("需旋转目标物体")]
public Transform target;//获取旋转目标
private float xcream;
private float ycream;
#endregion

public void update()
{

// 绕目标物旋转 UI
// step 1. get target object
// step 2. get target position
}

/// <summary>
/// 角度增加
/// </summary>
public void AngleAdd()
{
float x = 0;
float y = 50;
x += 5;
y += 5;
float currentAngle = transform.eulerAngles.x;
if (currentAngle + speed > 50 && currentAngle + speed < 90)
{
// limitangle(120);
// limitangleuandd(50);
Vector3 vector3 = new Vector3(1, 0, 0);
this.transform.RotateAround(target.position, vector3, speed);
Debug.Log("camera controller: angle: " + this.transform.eulerAngles);
// this.transform.Rotate(0, x * speed, 0, Space.World);
}
else
{
// currentAngle = 50;
Toast.Show("已经增大到最大值,请减小角度!", 1f);
}
}

/// <summary>
/// 角度减少
/// </summary>
public void AngleReduce()
{
float x = 0;
float y = 90;
x -= 5;
y -= 5;
float currentAngle = transform.eulerAngles.x;
if (currentAngle - speed > 50 && currentAngle - speed < 90)
{
// limitangle(120);
//limitangleuandd(50);
Vector3 vector3 = new Vector3(1, 0, 0);
this.transform.RotateAround(target.position, vector3, -speed);
Debug.Log("camera controller: angle: " + this.transform.eulerAngles);
// this.transform.Rotate(0, x * speed, 0, Space.World);
}
else
{
// currentAngle = 50;
Toast.Show("已经减小到最小值,请增大角度!", 1f);
}
}

  • 目的:通过上下按键控制相机沿 x 轴对目标物体转动同时限制 x 轴坐标范围为(50,90),对大于目标坐标的值予以过滤并提示用户反向操作以达到目的。

参考

Prev:
使用Hexo框架构建博客并发布
Next:
关于 Unity 不同方式的导出与详细使用的说明(基于 Android 平台)