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#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								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;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 |