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 ;
}
}