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.