Unity3d implementa movimento em terceira pessoa e ajuste de câmera

Mostrar o efeito primeiro

unidade3d

Em relação à movimentação do personagem, recomenda-se a utilização do componente Character Conrroller, com a vantagem de não precisar lidar com corpos rígidos, não ser afetado pela gravidade e possuir detecção física própria de colisões.

 Código de movimento do personagem, incluindo direção

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

public class player : MonoBehaviour
{
    CharacterController characterController;
    Animator animator;

    private float speed;
    public float walkspeed;
    public float runspeed;
    private bool isrun;

    public Transform cam;
    private Vector3 direction;
    public float turnSmoothTime = 0.1f;
    float turnSmoothVelocity;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }   
    // Update is called once per frame
    void Update()
    {
        //获取按键
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        if (horizontal!=0||vertical!=0)
        {
            
            animator.SetBool("Walk", true);
        }
        else
        {
            animator.SetBool("Walk", false);
        }
        if(Input.GetKey(KeyCode.LeftShift))
        {
            
            animator.SetBool("Run", true);
        }
        else
        {
            animator.SetBool("Run", false);
        }
        isrun=Input.GetKey(KeyCode.LeftShift);
        if(isrun)
        {
            speed = runspeed;
        }
        else
        {
            speed = walkspeed;
        }
        direction =new Vector3(horizontal,0f,vertical);
        if (direction.magnitude>=0.1f)
        {
            float targetangle=Mathf.Atan2(direction.x,direction.z)*Mathf.Rad2Deg+cam.eulerAngles.y;
            float angle = Mathf.SmoothDampAngle(transform.eulerAngles.y, targetangle, ref turnSmoothVelocity, turnSmoothTime);
            transform.rotation=Quaternion.Euler(0f,angle,0f);
            Vector3 moveDir = Quaternion.Euler(0f, targetangle, 0f) * Vector3.forward;
            characterController.Move(moveDir*speed* Time.deltaTime);
        }
        
    }
}
  

O próximo passo é ajustar a câmera. Aqui, usamos o plug-in cinemachine que vem com a unidade, o que é altamente recomendado. Você pode projetar um melhor ângulo de visão de acompanhamento da câmera sem usar códigos complicados.

Pacote de instalação:

Barra de ferramentas: Janela->Gerenciador de Pacotes

Basta instalar 

Aqui vamos usar o FreeLook Camera e depois vincular o personagem:

Configurações mais importantes:

         TopRig MiddleRig BottomRig Estes são para definir a trilha da câmera e basicamente definir a câmera. Os dados na imagem acima são uma tentativa de comparar e recomendar a todos que tentem. Certifique-se de alterar o Binding Mode para World Space.

Você pode encontrar uma situação em que a direção do movimento do jogador é oposta à direção do botão. Aqui você só precisa desmarcar a linha vermelha no eixo X e verificar o eixo Y acima.

 Código de conclusão da câmera (montado na câmera principal):

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

public class ThirdPersoncam : MonoBehaviour
{
    public Transform orientation;
    public Transform player;
    public Transform playerObj;

    public float rotationSpeed;
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        Vector3 Dir = player.position - new Vector3(transform.position.x, player.position.y, transform.position.z);
        orientation.forward = Dir.normalized;
        //获取按键
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");
        Vector3 inputDir = orientation.forward * vertical + orientation.right * horizontal;
        if (inputDir != Vector3.zero)
        {
            playerObj.forward = Vector3.Slerp(playerObj.forward, inputDir.normalized, Time.deltaTime * rotationSpeed);
        }
    }
}

O playerobj e a orientação aqui são objetos subvazios montados no personagem do jogo para auxiliar na orientação.

Acho que você gosta

Origin blog.csdn.net/m0_64652083/article/details/128794018
Recomendado
Clasificación