Unity 3D キャラクターの移動方向はカメラに追従します (一人称)

原理

キャラクターの体の回転を使用してカメラの左右のスライドを制御し、
カメラの回転を使用してカメラの上下のスライドを制御します。

詳細な分析

まず最初に、カメラがキャラクターのサブオブジェクト (目として機能する) であることを知る必要があります。そのため
、キャラクターが回転すると、カメラもそれに追従して同じ方向および同じ角度に回転します。
目(カメラ)が見る方向はキャラクターの真正面でなければなりません。

では、これを行うことでどのようなメリットがあるのでしょうか?
カメラのレンズがキャラクターの正面にロックされている場合、
キャラクターの移動方向の制御が非常に正確になります。

カメラを使用してレンズの上下左右のスライドを制御するだけの場合、
これでも完全な第一視点を実現できますが、
キャラクターが移動すると、
カメラの方向は変化するため、方向エラーが発生します。このとき、キャラクターの方向は変わりません。
例:カメラを左に90度回転させ、Wを押して前に進む準備をしましたが、キャラクターが右(最初の方向の前)に移動していることに気づきました。
ここに画像の説明を挿入します

したがって、正確な方向に移動したい場合は、カメラの向きとキャラクターの向きを一致させる必要があります。
ここに画像の説明を挿入します
※ 2 枚の絵の中のキャラクターとカメラの向きの区別に注意してください。

コードの説明

コア部分

//俯仰
//以摄像机的旋转控制镜头上下滑动
void Pitch()
{
    
    
  float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
  Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
  Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转

  //限定俯仰的角度
  if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
  {
    
    
    playerCam.localRotation = finalAngle;//赋值
  }
}

//偏转
//以人物的旋转控制镜头左右滑动
void Yaw()
{
    
    
  float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
  Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
  Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转

  player.localRotation =finalAngle;//赋值
}

詳細な分析

人やカメラを用意する

public Transform player;
public Transform playerCam;

ピッチとたわみの感度を設定します(ピッチとたわみの詳細は前回の記事で説明しています)

public float pitchSensitivity; //Y方向 俯仰(绕X轴)
public float yawSensitivity; //X方向 偏转(绕Y轴)

最大ピッチ角を制限します(水平方向のたわみに制限はありません)

public float pitchLimit = 75;

回転角度の計算

float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;

指定した軸を中心に回転します

Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right);//绕X轴负方向旋转的度数
Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数

理解 Quaternion.AngleAxis

クォータニオン: クォータニオンは基本的に方向と回転を計算するために Unity で使用されますAngleAxis:全体が
中心となる軸:軸を指定し、その軸の周りで指定された角度を回転させ、新しい回転結果を取得します。

targetRotation = Quaternion.AngleAxis(angel, direction);

角度: 回転角度を表します。
方向: どの軸を中心としたどの方向 (Vector3.up、Vector3.right など)

オイラー角を四元数に変換する

Quaternion finalAngle = playerCam.localRotation * pitch;
Quaternion finalAngle = player.localRotation * yaw;

最終課題の
カメラを完成させる

if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
        {
    
    
            playerCam.localRotation = finalAngle;
        }

player.localRotation =finalAngle;

完全なコード

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

public class PlayerLookControl : MonoBehaviour
{
    
    
    //获取摄像机和人物
    public Transform player;
    public Transform playerCam;

    //俯仰和偏转的灵敏度
    public float pitchSensitivity; //Y方向 俯仰(绕X轴)
    public float yawSensitivity; //X方向 偏转(绕Y轴)

    //最大俯仰角度
    public float pitchLimit = 75;

    private Quaternion playerCamCenter;

    void Start()
    {
    
    
        playerCamCenter = playerCam.localRotation;
        Cursor.lockState = CursorLockMode.Locked; //将鼠标光标锁定在窗口中心
        Cursor.visible = false; //隐藏鼠标光标
    }

    void Update()
    {
    
    
        Pitch();
        Yaw();
    }

    //俯仰
    //以摄像机的旋转控制镜头上下滑动
    void Pitch()
    {
    
    
        float pitchAngle = Input.GetAxis("Mouse Y") * pitchSensitivity * Time.deltaTime;
        Quaternion pitch = Quaternion.AngleAxis(pitchAngle, -Vector3.right); //绕X轴负方向旋转的度数
        Quaternion finalAngle = playerCam.localRotation * pitch; //欧拉角转化为四元数 使摄像机旋转

        //限定俯仰的角度
        if (Quaternion.Angle(playerCamCenter, finalAngle) < pitchLimit)
        {
    
    
            playerCam.localRotation = finalAngle;//赋值
        }
    }

    //偏转
    //以人物的旋转控制镜头左右滑动
    void Yaw()
    {
    
    
        float yawAngle = Input.GetAxis("Mouse X") * yawSensitivity * Time.deltaTime;
        Quaternion yaw = Quaternion.AngleAxis(yawAngle, Vector3.up); //绕Y轴旋转的度数
        Quaternion finalAngle = player.localRotation * yaw; //欧拉角转化为四元数 使人物旋转

        player.localRotation =finalAngle;//赋值
    }
}

おすすめ

転載: blog.csdn.net/m0_73241844/article/details/132445802