键盘输入
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ;
public class PlayerInput : MonoBehaviour
{
public static PlayerInput instance;
public float animSpeed = 0 ;
public Vector3 moveDirection;
[ SerializeField ] string keyUp;
[ SerializeField ] string keyDown;
[ SerializeField ] string keyRight;
[ SerializeField ] string keyLeft;
float xAxisValue;
float yAxisValue;
float targetXValue;
float targetYValue;
float velocity = 0 ;
float velocity2 = 0 ;
bool inputEnable = true ;
private void Awake ( )
{
instance = this ;
}
void Update ( )
{
targetYValue = ( Input. GetKey ( keyUp) ? 1 : 0 ) - ( Input. GetKey ( keyDown) ? 1 : 0 ) ;
targetXValue = ( Input. GetKey ( keyRight) ? 1 : 0 ) - ( Input. GetKey ( keyLeft) ? 1 : 0 ) ;
if ( inputEnable == false )
{
targetXValue = 0 ;
targetYValue = 0 ;
}
xAxisValue = Mathf. SmoothDamp ( xAxisValue, targetXValue, ref velocity, 0.1f ) ;
yAxisValue = Mathf. SmoothDamp ( yAxisValue, targetYValue, ref velocity2, 0.1f ) ;
Vector2 output = SquareToCircle ( new Vector2 ( xAxisValue, yAxisValue) ) ;
animSpeed = Mathf. Sqrt ( output. x * output. x + output. y * output. y) ;
moveDirection = transform. right * output. x + transform. forward * output. y;
}
Vector2 SquareToCircle ( Vector2 input)
{
Vector2 output;
output. x = input. x * Mathf. Sqrt ( 1 - ( input. y * input. y) / 2 ) ;
output. y = input. y * Mathf. Sqrt ( 1 - ( input. x * input. x) / 2 ) ;
return output;
}
}
模型移动
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ;
public class ActorController : MonoBehaviour
{
public GameObject model;
public Animator anim;
public CharacterController character;
float gravity = 9.8f ;
Vector3 worldDirection;
float moveSpeed = 5f ;
void Update ( )
{
anim. SetFloat ( "forward" , PlayerInput. instance. animSpeed) ;
if ( PlayerInput. instance. animSpeed > 0.01f )
{
Vector3 targetForward = Vector3. Slerp ( model. transform. forward, PlayerInput. instance. moveDirection, 0.3f ) ;
model. transform. forward = targetForward;
}
if ( character. isGrounded)
{
worldDirection = PlayerInput. instance. moveDirection;
}
worldDirection. y -= gravity * Time. deltaTime;
character. Move ( worldDirection * Time. deltaTime * moveSpeed) ;
}
}
相机旋转
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ;
public class CameraController : MonoBehaviour
{
public GameObject playerHandle;
public GameObject cameraHandle;
public GameObject model;
public float rotateX;
public float rotateY;
float tempEulerX;
void Update ( )
{
if ( Input. GetMouseButton ( 1 ) )
{
rotateX = Input. GetAxisRaw ( "Mouse X" ) ;
rotateY = Input. GetAxisRaw ( "Mouse Y" ) ;
Vector3 tempModelEuler = model. transform. eulerAngles;
playerHandle. transform. Rotate ( Vector3. up, rotateX) ;
tempEulerX -= rotateY;
tempEulerX = Mathf. Clamp ( tempEulerX, - 15 , 20 ) ;
cameraHandle. transform. localEulerAngles = new Vector3 ( tempEulerX, 0 , 0 ) ;
model. transform. eulerAngles = tempModelEuler;
}
}
}