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);
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值