【Unity】常见的角色移动旋转

 

在Unity 3D游戏引擎中,可以使用不同的方式对物体进行旋转。以下是几种常见的旋转方式:

  1. 欧拉角(Euler Angles):欧拉角是一种常用的旋转表示方法,通过绕物体的 X、Y 和 Z 轴的旋转角度来描述物体的旋转。在Unity中,可以通过修改物体的 transform.eulerAngles 属性来进行欧拉角旋转。

  2. 四元数(Quaternion):四元数是另一种常见的旋转表示方法,在Unity中经常用于插值和平滑旋转。使用四元数可以避免万向锁等问题,并提供更高效和准确的旋转计算,可以通过修改物体的 transform.rotation 属性来进行四元数旋转。

  3. 轴角(Axis-Angle):轴角表示法使用一个单位向量来定义旋转轴,并使用旋转角度来描述旋转。在Unity中,可以使用 Quaternion.AngleAxis() 函数来创建一个轴角旋转,并通过修改物体的 transform.rotation 属性进行应用。

  4. 矩阵(Matrix):矩阵表示法通过使用旋转矩阵来描述旋转变换。在Unity中,可以通过修改物体的 transform.localRotation 属性或 transform.rotation 属性中的矩阵元素来进行矩阵旋转。


    我们接下来实现下面2种方法来实现人物的旋转和移动

一:使用WADS进行移动旋转 

代码实现: 

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    // Start is called before the first frame update

    //设置速度
    public float speed = 6f;
    Rigidbody rig;
    //动画
    Animator anim;
    //偏移量
    Vector3 moveMent;

    //跳起来的力
    public float Jump_AddForce = 300f;

    void Awake()
    {
        //获取刚体
        rig = GetComponent();
        //获取动画
        anim = GetComponent();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        // -1  1
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");

        //移动 横向和纵向
        Move(h, v);

    }
    void Move(float h, float v)
    {
        //设置方向
        moveMent.Set(h, 0f, v);
        moveMent = moveMent.normalized * speed * Time.deltaTime;

        //通过刚体主键移动 对象
        rig.MovePosition(transform.position + moveMent);

        //移动动画
        bool isWalking = (h != 0 || v != 0);
        anim.SetBool("Run", isWalking);

        //旋转
        Vector3 dir = new Vector3(h, 0, v);
        if (dir != Vector3.zero)
        {
            transform.rotation = Quaternion.LookRotation(dir);
            transform.Translate(Vector3.forward * speed * Time.deltaTime);
        }
    }

二:使用鼠标来控制人物的旋转,WASD移动

代码实现:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
 
public class PlayerMove : MonoBehaviour
{
    // Start is called before the first frame update
 
    //设置速度
    public float Speed = 6f;
    Rigidbody RigidbodyPlayer;
    Animator animatorPlayer;
    //偏移量
    Vector3 moveMent;
    //地板
    LayerMask floorMask;
 
    //Vector3 playerToMouse;
 
    void Awake()
    {
        //获取刚体
        RigidbodyPlayer = GetComponent();
        //获取动画
        animatorPlayer = GetComponent();
        //获取地板
        floorMask = LayerMask.GetMask("floor");
    }
 
    // Update is called once per frame
    void FixedUpdate()
    {
        // -1  1
        float h = Input.GetAxisRaw("Horizontal");
        float v = Input.GetAxisRaw("Vertical");
 
        //移动 横向和纵向
        Move(h, v);
 
        //检测动画
        Animating(h, v);
 
        //角色旋转
        Turning();
    }
    void Move(float h, float v)
    {
        //设置方向
        moveMent.Set(h, 0f, v);
        moveMent = moveMent.normalized * Speed * Time.deltaTime;
 
        //通过刚体主键移动 对象
        RigidbodyPlayer.MovePosition(transform.position + moveMent);
    }
    //移动动画
    void Animating(float h, float v)
    {
        if (h != 0 || v != 0)
        {
            animatorPlayer.SetBool("IsWaking", true);
        }
        else
        {
            animatorPlayer.SetBool("IsWaking", false);
        }
    }
    void Turning()
    {
        Ray cameraRay = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit cameraHit;
        if (Physics.Raycast(cameraRay, out cameraHit, 100f, floorMask))
        {
            Vector3 playerToMouse = cameraHit.point - transform.position;
            playerToMouse.y = 0f;
            //旋转 四元素
            Quaternion newQraternion = Quaternion.LookRotation(playerToMouse);
 
            //角色刚体旋转
            RigidbodyPlayer.MoveRotation(newQraternion);
        }
    }
}


最后

以上步骤就是实现角色的移动旋转。希望能对你们提供帮助!!!

看到的小伙伴一键三连一下吧,你们的支持让我更有动力去创作和分享,希望能一直为你们带来惊喜和收获。

 

一键三连吧!

 

你可能感兴趣的:(Unity,unity,游戏引擎)