Unity 常用旋转API

Unity中的旋转通常可以用Transform 直接控制 和 rotation 控制两种方式。

一、Transform控制(工程中的scene1)

1.1 Transform.Rotate

旋转某个角度

函数定义

public void Rotate(Vector3 eulerAngles);
public void Rotate(Vector3 axis, float angle);
public void Rotate(Vector3 eulerAngles, Space relativeTo);
public void Rotate(float xAngle, float yAngle, float zAngle);
public void Rotate(Vector3 axis, float angle, Space relativeTo);
public void Rotate(float xAngle, float yAngle, float zAngle, Space relativeTo);
这个函数通常用于Update函数中,用于不断的旋转。如下

void Update () {
     //以每秒rotateSpeed的速度绕着y轴旋转
     transform.Rotate(0, rotateSpeed * Time.deltaTime, 0);
}
1.2 Transform.RotateAround

以某点为中心旋转。

函数定义

public void RotateAround(Vector3 axis, float angle);
public void RotateAround(Vector3 point, Vector3 axis, float angle);
这个函数通常也在Update中,不断地围绕着点运动。如下:

void Update () 
{
    //在Y轴以每秒rotateSpeed的速度围绕着transformCenter 旋转。
    //这会改变物体的位置和旋转。
    transform.RotateAround(transformCenter.position,Vector3.up,rotateSpeed * Time.deltaTime);
}
1.3 Transform.eulerAngles

设置物体的欧拉角为某个度数

属性定义

public Vector3 eulerAngles { get; set; }
直接设置即可,一般不用于Update函数中递增。如下

void Update ()
{
    //设置旋转角度为一个固定值
    //旋转作为欧拉角度。
    //x、y、z角代表绕z轴旋转z度,绕x轴旋转x度,绕y轴旋转y度(这个顺序)。
    //仅使用者这个变量读取和设置角度到绝对值。不要递增它们,当超过角度360度,它将失败。使用Transform.Rotate替代。
    transform.eulerAngles = new Vector3(0,0,60);
}

1.4 Transform.LookAt

旋转物体,使其朝向某个位置

函数定义

public void LookAt(Transform target);
public void LookAt(Vector3 worldPosition);
public void LookAt(Transform target, Vector3 worldUp);
public void LookAt(Vector3 worldPosition, Vector3 worldUp);
简单例子:

public class SimpleRotate4 : MonoBehaviour
{

    public float rotateSpeed = 20;
    public float moveSpeed = 4;
    private float curY;
    private bool moveDown = false;
    public Transform transformCenter;
    void Update ()
   {
       //这段代码只是让物体不断的上下运动
       moveDown = moveDown ? curY > -4 : curY > 4;
        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;
        transform.position = new Vector3(-2, curY, 0);

        //朝向目标
        //当该物体设置了LookAt并指定了目标物体时,该物体的z轴将始终指向目标物体
        transform.LookAt(transformCenter);
    }
}

1.5 Transform.forward

强制改变z轴朝向。

属性定义

public Vector3 forward { get; set; }
例子:

public class SimpleRotate5 : MonoBehaviour
{
    public float rotateSpeed = 20;
    public float moveSpeed = 4;
    private float curY;
    private bool moveDown = true;
    public Transform transformCenter;
	
    void Update ()
    {

        //这段代码只是让物体不断的上下运动
        moveDown = moveDown ? curY > -4 : curY > 4;
        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;
        transform.position = new Vector3(2, curY, 0);

        //强制设置z轴朝向
        //本例子和LookAt区别不大
        transform.forward = transformCenter.position - transform.position;
        
    }
}


二、Rotation 与 Quaternion(对应scene2)

2.1 Quaternion.eulerAngles

四元数的欧拉角

属性定义

public Vector3 eulerAngles { get; set; }
实例

    void Update () 
    {
        //功能类似于 transform.eulerAngles = new Vector3(0,0,60);
        //但是不能直接设置rotation.eulerAngles 需要一个完整的Quaternion
        Quaternion q1 = Quaternion.identity;
        q1.eulerAngles = new Vector3(0,60,0);
        transform.rotation = q1;
    }
2.2 Quaternion.SetFromToRotation (建议参考scene2场景来学习)

创建一个从fromDirection到toDirection的旋转

函数定义

public void SetFromToRotation(Vector3 fromDirection, Vector3 toDirection);
实例:

public class QuaternionRotate2 : MonoBehaviour
{
    public Transform A;
    public Transform B;
    public Transform C;
    public float moveSpeed = 4;
    private float curY;
    private bool moveDown = false;
    private Quaternion q1 = Quaternion.identity;
    void Update () 
    {
        moveDown = moveDown ? curY > -4 : curY > 4;
        curY -= moveDown ? Time.deltaTime * moveSpeed : -Time.deltaTime * moveSpeed;
        B.position = new Vector3(4, curY, 0);

        //创建一个从fromDirection到toDirection的旋转。
        q1.SetFromToRotation(A.position,B.position);
        C.rotation = q1;

        Debug.DrawLine(Vector3.zero, A.position,Color.red);
        Debug.DrawLine(Vector3.zero, B.position, Color.green);
        Debug.DrawLine(C.position, C.position + new Vector3(0,2,0), Color.black);
        Debug.DrawLine(C.position, C.TransformPoint(0,2,0), Color.blue);
    }
}
2.3 Quaternion.SetLookRotation

旋转物体到某个角度

函数定义

public void SetLookRotation(Vector3 view);
public void SetLookRotation(Vector3 view, Vector3 up);
实例:

public class QuaternionRotate3 : MonoBehaviour 
{
    private Quaternion q1 = Quaternion.identity;
    public Transform transformCenter;
    void Update () 
    {
        //相当于transform.LookAt
        q1.SetLookRotation(transformCenter.position);
        transform.rotation = q1;
    }
}

2.4 Quaternion.AngleAxis

函数定义

public static Quaternion AngleAxis(float angle, Vector3 axis);
围绕axis轴,旋转angle度。

实例:

void Update () 
{
    //绕y轴旋转60度
    transform.rotation = Quaternion.AngleAxis(60,Vector3.up);
}
2.5 Quaternion.Slerp

球形插值。

函数定义

public static Quaternion Slerp(Quaternion a, Quaternion b, float t);
可以用于旋转值的不断靠近。如下:

public class QuaternionRotate5 : MonoBehaviour
{
    public Transform A;
    public float rotateSpeed = 10;
    void Update () {
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(A.position - transform.position), 0.8f);
    }
}

需要下载工程的可以点击下载



















  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3D中常用API包括Component、Transform、GameObject、Object和Time等。\[1\]这些API可以用于处理游戏对象的组件、变换、实例化和销毁等操作。例如,可以使用Component来获取和管理游戏对象的组件,使用Transform来控制游戏对象的位置、旋转和缩放,使用GameObject来创建、查找和销毁游戏对象,使用Object来处理资源的加载和释放,使用Time来获取游戏的时间信息。此外,还有一些常见的API函数,如Instantiate函数用于实例化预制件,Start函数和Update函数用于处理游戏对象的初始化和更新等。\[2\]\[3\]这些API函数Unity开发中经常使用的工具,可以帮助开发者实现各种功能和效果。 #### 引用[.reference_title] - *1* [Unity3D数字孪生笔记——Unity常用API篇](https://blog.csdn.net/Lcl_huolitianji/article/details/120875486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Unity3D常用API](https://blog.csdn.net/u011360242/article/details/77046732)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【Unity 3D】常见API的讲解以及在C#脚本中的执行(附源码)](https://blog.csdn.net/jiebaoshayebuhui/article/details/128510864)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值