Unity 控制物体旋转、朝向的一些方法

Unity 控制物体旋转、朝向的一些方法

1,transform. Lookat( )

transform.Lookat(target.position);

立即看向target的位置, 很生硬.

2,Quaternion.LookRotation( )

transform.rotation = Quaternion.LookRotation(target.position - self.position);

也是,立即看向target的位置。

3,Quaternion.RotateTowards( )

Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.RotateTowards(self.rotation, q, turnSpeed * Time.deltaTime);

匀速转向target的位置。(匀速转过去, 虽然不那么生硬了, 但是还不够自然)

4,Quaternion.Slerp( )

Quaternion q = Quaternion.LookRotation(target.position - self.position);
Quaternion.Slerp(self.rotation, q, turnSpeed * Time.deltaTime);

非匀速转向target的位置。(人物转向看起来比较合理, 比较自然了)
Lerp()方法是平分长度, Slerp()方法是平分弧度

5,transform.Rotate ( )

transform.rotate(Vector3.up, Space.Self);

地球自转。

6,transform.RotateAround( )

transform.rotateAround(sun.position, Vector3.up, turnSpeed * Time.deltaTime);

绕太阳公转。

7, 四元数*向量

将Vector3.right 饶Z轴 旋转angle度

Vector3 dir = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right;

以下是DOTween的方法

1, transform.DORotate()

transform.DORotate(new Vector3(0, 60, 0), 0.3f);

0.3秒转到(0, 60, 0); Rotation
DOTween的, 注意他的参数是个三元数, 要是想与另一个物体的朝向一致, 就:

transform.DORotate(other.transform.eulerAngles, 0.3f);

2, transform.DOLookAt()

transform.DOLookAt(other.transform, 0.3f)

还是DOTween的, 和transform.LookAt差不多, 设置个时间, 能达到lerp的效果, 还能在后面.SetEase(Ease.XXX);
加一些运动曲线


综合例子:

项目需求: 玩家尽量看向敌人的方向(远离敌人移动时也看向敌人), WASD控制移动和转向

public class PlayerControl : MonoBehaviour
{
    //规定以towards.Forward为正方向, 而不是世界坐标的正方向
    public Transform towards;

    public float moveSpeed;
    public float turnSpeed;

    private void Update()
    {
        Move();
    }

    private void Move()
    {
        float v = Input.GetAxis("Vertical");
        float h = Input.GetAxis("Horizontal");

        //移动
        transform.Translate(new Vector3(h, 0, v) * Time.deltaTime * moveSpeed, towards);//正方向为towards.Forward

        //玩家操作转向
        if (v != 0 || h != 0)
        {
            Vector3 tempTowards;
            if (v < 0)
            {
                //abs是为了禁止玩家人物朝后
                //人物 倒退时和前进时的左右转向是相反的,所以是-h
                tempTowards = towards.forward * Mathf.Abs(v) + towards.right * -h;
            }
            else
            {
                tempTowards = towards.forward * v + towards.right * h;
            }
            Quaternion q = Quaternion.LookRotation(tempTowards);
            //平滑转向
            transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
        }
        //玩家没操作的时候, 就看向正方向
        else
        {
            Quaternion q = Quaternion.LookRotation(towards.forward);
            transform.rotation = Quaternion.Slerp(transform.rotation, q, turnSpeed * Time.deltaTime);
        }
    }
}
  • 34
    点赞
  • 178
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Unity有多种方法可以控制物体朝向,以下列举几种常见的方法: 1. Transform.LookAt()方法:可以将物体朝向指向某一点的位置,例如: ```csharp public Transform target; // 目标点的Transform组件 void Update() { transform.LookAt(target.position); } ``` 2. Transform.Rotate()方法:可以将物体绕某一轴旋转一定角度,例如: ```csharp public float rotateSpeed = 10f; // 旋转速度 void Update() { float h = Input.GetAxis("Horizontal"); // 输入水平方向的值 float v = Input.GetAxis("Vertical"); // 输入垂直方向的值 transform.Rotate(new Vector3(-v, h, 0) * rotateSpeed); } ``` 3. Rigidbody.AddTorque()方法:可以给物体施加一个力矩,使其绕某一轴旋转,例如: ```csharp public float torque = 10f; // 力矩大小 void FixedUpdate() { float h = Input.GetAxis("Horizontal"); // 输入水平方向的值 float v = Input.GetAxis("Vertical"); // 输入垂直方向的值 Rigidbody rb = GetComponent<Rigidbody>(); rb.AddTorque(new Vector3(-v, h, 0) * torque); } ``` 4. 自定义脚本:可以根据自己的需要编写脚本来控制物体朝向,例如: ```csharp public Transform target; // 目标点的Transform组件 void Update() { Vector3 direction = target.position - transform.position; // 计算目标方向 direction.y = 0; // 忽略Y轴方向 Quaternion rotation = Quaternion.LookRotation(direction); // 计算旋转角度 transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * 10f); // 平滑旋转 } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值