You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
using UnityEngine;
 | 
						|
using System.Collections;
 | 
						|
 | 
						|
namespace RootMotion.Demos {
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// User input for a third person character controller.
 | 
						|
	/// </summary>
 | 
						|
	public class UserControlThirdPerson : MonoBehaviour {
 | 
						|
 | 
						|
		// Input state
 | 
						|
		public struct State {
 | 
						|
			public Vector3 move;
 | 
						|
			public Vector3 lookPos;
 | 
						|
			public bool crouch;
 | 
						|
			public bool jump;
 | 
						|
			public int actionIndex;
 | 
						|
		}
 | 
						|
 | 
						|
		public bool walkByDefault;        // toggle for walking state
 | 
						|
		public bool canCrouch = true;
 | 
						|
		public bool canJump = true;
 | 
						|
 | 
						|
		public State state = new State();			// The current state of the user input
 | 
						|
 | 
						|
		protected Transform cam;                    // A reference to the main camera in the scenes transform
 | 
						|
 | 
						|
		protected virtual void Start () {
 | 
						|
			// get the transform of the main camera
 | 
						|
			cam = Camera.main.transform;
 | 
						|
		}
 | 
						|
 | 
						|
		protected virtual void Update () {
 | 
						|
			// read inputs
 | 
						|
			state.crouch = canCrouch && Input.GetKey(KeyCode.C);
 | 
						|
			state.jump = canJump && Input.GetButton("Jump");
 | 
						|
 | 
						|
			float h = Input.GetAxisRaw("Horizontal");
 | 
						|
			float v = Input.GetAxisRaw("Vertical");
 | 
						|
			
 | 
						|
			// calculate move direction
 | 
						|
			Vector3 move = cam.rotation * new Vector3(h, 0f, v).normalized;
 | 
						|
 | 
						|
			// Flatten move vector to the character.up plane
 | 
						|
			if (move != Vector3.zero) {
 | 
						|
				Vector3 normal = transform.up;
 | 
						|
				Vector3.OrthoNormalize(ref normal, ref move);
 | 
						|
				state.move = move;
 | 
						|
			} else state.move = Vector3.zero;
 | 
						|
 | 
						|
			bool walkToggle = Input.GetKey(KeyCode.LeftShift);
 | 
						|
 | 
						|
			// We select appropriate speed based on whether we're walking by default, and whether the walk/run toggle button is pressed:
 | 
						|
			float walkMultiplier = (walkByDefault ? walkToggle ? 1 : 0.5f : walkToggle ? 0.5f : 1);
 | 
						|
 | 
						|
			state.move *= walkMultiplier;
 | 
						|
			
 | 
						|
			// calculate the head look target position
 | 
						|
			state.lookPos = transform.position + cam.forward * 100f;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 |