意见箱
恒创运营部门将仔细参阅您的意见和建议,必要时将通过预留邮箱与您保持联络。感谢您的支持!
意见/建议
提交建议

【Unity开发小技巧】Unity控制人物行走的几种表现方式

来源:恒创科技 编辑:恒创科技编辑部
2022-10-01 11:08:04


目录

​​一:第三人称视角​​


【Unity开发小技巧】Unity控制人物行走的几种表现方式

​​1.左右键旋转,前后键前进后退​​

​​2.鼠标控制自动寻路​​

​​二:第一人称视角​​

​​1.相机设置为玩家子节点​​

​​2.鼠标自由视角CharacterController​​


一:第三人称视角1.左右键旋转,前后键前进后退
// Update is called once per frame
void Update () {
float ver = Input.GetAxis("Vertical");
transform.position += transform.forward * ver * Time.deltaTime * 5;

float hor = Input.GetAxis("Horizontal");
transform.Rotate(transform.up * hor * Time.deltaTime * 100);
}
-----------------------------------------------------------------------------
private void Update()
{
if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
{
this.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后
{
this.transform.Translate(Vector3.forward * -m_speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左
{
this.transform.Translate(Vector3.right * -m_speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右
{
this.transform.Translate(Vector3.right * m_speed * Time.deltaTime);
}
}

【Unity开发小技巧】Unity控制人物行走的几种表现方式_子节点

2.鼠标控制自动寻路

参考之前的记录Unity的自动寻路NavMessAgent系统(一)_幻世界

【Unity开发小技巧】Unity控制人物行走的几种表现方式_自动寻路_02

二:第一人称视角1.相机设置为玩家子节点

【Unity开发小技巧】Unity控制人物行走的几种表现方式_右键_03

左右键旋转,前后键前进后退,相机设置为目标子节点固定相对位置效果如上图

鼠标控制相机旋转,效果如上图

// 控制玩家移动
void Update () {
float ver = Input.GetAxis("Vertical");
transform.position += transform.forward * ver * Time.deltaTime * 5;
}
控制相机视角
//鼠标左键控制上下转动
if (Input.GetMouseButton(0))
{
transform.Rotate(-Input.GetAxis("Mouse Y") * 2, 0, 0);
}
//鼠标右键控制左右转动
if (Input.GetMouseButton(1))
{
transform.Rotate(0, Input.GetAxis("Mouse X") * 2, 0);
}
2.鼠标自由视角CharacterController

【Unity开发小技巧】Unity控制人物行走的几种表现方式_右键_04

两个脚本,PlayerMovement控制身体的位移,PlayerCamera控制自己的相机的旋转

【Unity开发小技巧】Unity控制人物行走的几种表现方式_右键_05

public class PlayerMovement : MonoBehaviour
{
public CharacterController controller;
public float speed = 12f;
public float gravity = 10f;
public float jumpHeight = 2f;
public Transform groundCheck;
public float groundDistance = 0.4f;
public LayerMask groundMask;//地面layer
Vector3 velocity;
bool isGrounded;//是否落地
float x;
float z;
// Update is called once per frame
void Update()
{
x = Input.GetAxis("Horizontal");
z = Input.GetAxis("Vertical");

Vector3 move = transform.right * x + transform.forward * z;
controller.Move(move * speed * Time.deltaTime);

isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
if (isGrounded && velocity.y < 0)
{
velocity.y = -2f;
}

if (Input.GetButtonDown("Jump") && isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * gravity);
}
velocity.y -= gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
}


【Unity开发小技巧】Unity控制人物行走的几种表现方式_Unity控制移动_06

public class PlayerCamera : MonoBehaviour
{
private float mouseSensitivity = 300;
private Transform playerBody;
// Start is called before the first frame update
void Awake()
{
Cursor.lockState = CursorLockMode.Locked;
playerBody = transform.parent;
}

// Update is called once per frame
void Update()
{
float mouseX = Input.GetAxis("Mouse X") * mouseSensitivity * Time.deltaTime;
playerBody.Rotate(Vector3.up * mouseX);

float mouseY = Input.GetAxis("Mouse Y") * mouseSensitivity * Time.deltaTime;
transform.localEulerAngles -= new Vector3(mouseY, 0f, 0f);

}
}
上一篇: 租用美国服务器:潜在的风险与应对策略。 下一篇: MongoDB 5.0 扩展开源文档数据库操作