1、创建一个空物体,挂载Rigidbody组件,并设置相应参数
2、在上述空物体下创建一个胶囊体,两个空物体,一个用来控制朝向,另一个用来控制摄像机
3、给摄像机创建一个父物体,并挂载脚本MoveCamera_01.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MoveCamera_01 : MonoBehaviour
{
public Transform cameraPosition;
private void Update()
{
transform.position = cameraPosition.position;
}
}
4、给摄像机挂载脚本PlayerCam_01.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerCam_01 : MonoBehaviour
{
public float sensX = 400;
public float sensY = 400;
public float minAngle = -90f;
public float maxAngle = 90f;
public Transform orientation;
private float xRotation;
private float yRotation;
private void Start()
{
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
private void Update()
{
float mouseX = Input.GetAxisRaw("Mouse X") * Time.deltaTime * sensX;
float mouseY = Input.GetAxisRaw("Mouse Y") * Time.deltaTime * sensY;
yRotation += mouseX;
xRotation -= mouseY;
xRotation = Mathf.Clamp(xRotation, minAngle, maxAngle);
transform.rotation = Quaternion.Euler(xRotation, yRotation, 0);
orientation.rotation = Quaternion.Euler(0, yRotation, 0);
}
}
5、给主角挂载脚本PlayerMovement_01.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement_01 : MonoBehaviour
{
public float moveSpeed = 7;
public float groundDrag = 5;
public float playerHeight = 2;
public LayerMask whatIsGround;
private bool grounded;
public float jumpForce = 6;
public float jumpCooldown = 0.25f;
public float airMultiplier = 0.4f;
private bool readyToJump = true;
public KeyCode jumpKey = KeyCode.Space;
public Transform orientation;
private float h;
private float v;
private Vector3 moveDirection;
private Rigidbody rb;
private void Start()
{
rb = GetComponent<Rigidbody>();
rb.freezeRotation = true;
}
private void Update()
{
grounded = Physics.Raycast(transform.position, Vector3.down, playerHeight * 0.5f + 0.2f, whatIsGround);
MyInput();
SpeedControl();
if (grounded)
rb.drag = groundDrag;
else
rb.drag = 0;
}
private void FixedUpdate()
{
MovePlayer();
}
private void MyInput()
{
h = Input.GetAxisRaw("Horizontal");
v = Input.GetAxisRaw("Vertical");
if (Input.GetKey(jumpKey) && readyToJump && grounded)
{
readyToJump = false;
Jump();
Invoke(nameof(ResetJump), jumpCooldown);
}
}
private void MovePlayer()
{
moveDirection = orientation.forward * v + orientation.right * h;
if (grounded)
{
rb.AddForce(moveDirection.normalized * moveSpeed * 10f, ForceMode.Force);
}
else if (!grounded)
{
rb.AddForce(moveDirection.normalized * moveSpeed * 10f * airMultiplier, ForceMode.Force);
}
}
private void SpeedControl()
{
Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
if (flatVel.magnitude > moveSpeed)
{
Vector3 limitedVel = flatVel.normalized * moveSpeed;
rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
}
}
private void Jump()
{
rb.velocity = Vector3.zero;
rb.AddForce(transform.up * jumpForce, ForceMode.Impulse);
}
private void ResetJump()
{
readyToJump = true;
}
}