簡體   English   中英

如何讓我的角色在 Unity 3d 中看向相機的方向?

[英]How to make my character look in the direction of the camera in Unity 3d?

我的角色有一個機器相機,它移動得非常好。 但是當我移動鼠標來改變相機方向時,它並沒有朝那個方向看。 而且我不知道如何讓它朝那個方向看。

我在腳本頂部引用了名為 cam 的原始相機。

該腳本具有移動、旋轉、animation 等不同的功能。

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

//so that unity recognises the callbacks ctx passed to the movementinput
using UnityEngine.InputSystem;

public class AnimationAndMovController : MonoBehaviour
{
public Transform cam;

public float speed;
//here we are creadting three vars for the animation
//vector2 currentMovementInput stores the input axis of the player
//vector3 store the current position of the player


PlayerInput playerInput; 
CharacterController characterController;
Animator animator;

Vector2 currentMovementInput;
Vector3 currentMovement;
Vector3 currentRunMovement;
Vector3 moveDir;


bool isMovementPressed;
bool isRunPressed;

float rotationFactor = 15.0f;
// float turnSmoothtime = 0.1f;
// float turnSmoothVelocity ;
float runMultiplier = 4.0f;

int walkHash ;
int runHash ;

//runs before start function
void Awake(){
    playerInput = new PlayerInput();
    characterController = GetComponent<CharacterController>();
    animator = GetComponent<Animator>();
    // walkHash = Animator.StringToHash("Walking");
    // runHash = Animator.StringToHash("run");

    //now instead of writing the logic three times we pass the callback ctx to the movementInput() function
    playerInput.CharacterControls.Move.started += movementInput;
    playerInput.CharacterControls.Move.canceled += movementInput;
    playerInput.CharacterControls.Move.performed += movementInput;
    playerInput.CharacterControls.Run.started += handleRun;
    playerInput.CharacterControls.Run.canceled += handleRun;
}

void handleRun(InputAction.CallbackContext ctx){
    isRunPressed = ctx.ReadValueAsButton();
}

//we are going to handle rotations with quaternions
void handleRotation(){
    Vector3 positionToLookAt;

    positionToLookAt.x = currentMovement.x;
    positionToLookAt.y = 0.0f ;
    positionToLookAt.z = currentMovement.z;

    Vector3 direction = new Vector3(positionToLookAt.x, 0.0f, positionToLookAt.z).normalized;

    Quaternion currentRotation = transform.rotation;

    //we take the current rotation and the target rotation and slerp them *FYI : Im still not sure how slerp works
    if(isMovementPressed){
        Quaternion targetRotation = Quaternion.LookRotation(positionToLookAt);
        transform.rotation = Quaternion.Slerp(currentRotation, targetRotation, rotationFactor * Time.deltaTime);

        
    }

}

//we are passing the callback ctx to this function so that we dont have to call the function everytime we start, cancel or perform the movement
void movementInput(InputAction.CallbackContext ctx){
    //we are setting the movement input to the axis of the player
    currentMovementInput = ctx.ReadValue<Vector2>();
    currentMovement.x = currentMovementInput.x;
    //we are setting the z axis to the y axis of the player because we move y axis on keyboard or joystick but in game we move in z axis
    currentMovement.z = currentMovementInput.y;


    //now we are setting the run movement to the current movement
    currentRunMovement.x = currentMovementInput.x *  runMultiplier;
    currentRunMovement.z = currentMovementInput.y * runMultiplier;

    isMovementPressed = currentMovementInput.x != 0 || currentMovementInput.y != 0;

}

void handleAnimation(){
    bool walk = animator.GetBool("walking");
    bool run = animator.GetBool("run");

    if(isMovementPressed && !walk){
        animator.SetBool("walking", true);
    }
    else if(!isMovementPressed && walk){
        animator.SetBool("walking", false);
    }

    if((isMovementPressed && isRunPressed) && !run){
        animator.SetBool("run", true);
    }
    else if((!isMovementPressed || !isRunPressed)&& run){
        animator.SetBool("run", false);
    }
}

void handleGravity(){
    //we are setting the gravity to -9.8f because we are moving in y axis
    if(characterController.isGrounded){
        float groundGravity = -0.05f;
        currentMovement.y = groundGravity;
        currentRunMovement.y = groundGravity;

    }
    else{
        float gravity = -9.8f;
        currentMovement.y += gravity * Time.deltaTime;
        currentRunMovement.y += gravity * Time.deltaTime;
    }
}

// Update is called once per frame
void Update()
{
    handleAnimation();
    handleRotation();
    handleGravity();
    
    if(isRunPressed){
        characterController.Move(currentRunMovement * Time.deltaTime);
    }
    else{
        

     characterController.Move(currentMovement * Time.deltaTime);
    }
   
}

//we are checking if the player script gets enabled or disabled and accordingly we are enabling or disabling the player input
void OnEnable(){
    playerInput.CharacterControls.Enable();
}

void OnDisable(){
    playerInput.CharacterControls.Disable();
}

}

使用Transform.LookAt ,它將游戲對象的旋轉指向目標的位置。

在你的情況下,這將是

transform.LookAt(cam);

有很多代碼需要深入研究。 我會嘗試:

Quaternion cameraRot = Camera.Main.transform.rotation;
transform.rotation = cameraRot;

或者,如果您有一個目標Quaternion.LookRotation

Vector3 relativePos = target.position - transform.position;

// the second argument, upwards, defaults to Vector3.up
Quaternion rotation = Quaternion.LookRotation(relativePos, Vector3.up);
transform.rotation = rotation;

希望有幫助

這是我使用的代碼..

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

public class MoveCamera : MonoBehaviour
{
    public float sensitivity = 1000f;
    public float xRotation = 0f;
    

    public Transform playerBody;
    public Quaternion localRotate;
    
    
    // Start is called before the first frame update
    void Start()
    {
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void Update()
    {
        float MX = Input.GetAxis("Mouse X")*sensitivity*Time.deltaTime;
        float MY = Input.GetAxis("Mouse Y")*sensitivity*Time.deltaTime;

        xRotation -= MY;
        xRotation = Mathf.Clamp(xRotation,-90f,90f);
        
        transform.localRotation = Quaternion.Euler(xRotation,0f,0f);
        localRotate = transform.localRotation;
        playerBody.Rotate(Vector3.up * MX);
    }
}

您看到的播放器主體是播放器 object 給您的角色...注意,相機是使用的不是。 電影院和播放器內部...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM