topical media & game development
lib-unity-presentation-Assets-Player-Scripts-FPSWalker.cs / cs
using UnityEngine;
using System.Collections;
public enum Direction { right, left };
public class FPSWalker : MonoBehaviour {
public float speed= 3.5f;
public float jumpSpeed= 8.0f;
public float gravity= 20.0f;
public static Direction movementDirection = Direction.right;
private Vector3 moveDirection= Vector3.zero;
private bool grounded = false;
private Transform transCache;
private Transform graphicsTransform;
CharacterController controller;
private bool hardMovementLock = false;
public void SetMovementLock(bool value)
{
hardMovementLock = value;
}
Vector3 spawnPos;
void Awake()
{
transCache = transform;
spawnPos = transCache.position;
controller = GetComponent<CharacterController>();
graphicsTransform = transCache.FindChild("Graphics");
}
private float horInput = 0;
private float verInput = 0;
private float lastJump = 0;
void LateUpdate (){
if (hardMovementLock) return;
if (grounded)
{
if (GameManager.AllowInput())
{
horInput = 0;// Input.GetAxisRaw("Vertical");
verInput = Input.GetAxisRaw("Horizontal");
if (Input.GetKey(KeyCode.RightShift) || Input.GetKey(KeyCode.LeftShift))
verInput *= 3;
}
else
horInput = verInput = 0;
if (verInput > 0)
{
movementDirection = Direction.right;
graphicsTransform.localEulerAngles = new Vector3(0, 0,0);
}
else if (verInput < 0)
{
movementDirection = Direction.left;
graphicsTransform.localEulerAngles = new Vector3(0, 180, 0);
}
else
{
graphicsTransform.localEulerAngles = new Vector3(0, 90, 0);
}
// We are grounded, so recalculate movedirection directly from axes
moveDirection.y = 0;
Vector3 desiredMoveDirection = new Vector3(horInput, 0, verInput);
desiredMoveDirection *= speed;// Mathf.Clamp(speed, 0, 3.5f);
desiredMoveDirection = transform.TransformDirection(desiredMoveDirection);
if(desiredMoveDirection.magnitude > moveDirection.magnitude)
//Speed up..slower
moveDirection = Vector3.Lerp(moveDirection, desiredMoveDirection, Time.deltaTime*10);
else
moveDirection = Vector3.Lerp(moveDirection, desiredMoveDirection, Time.deltaTime * 40);
//Debug.Log( Vector3.Magnitude(moveDirection) +" - "+(speed * Time.deltaTime *60) );
//TODO: sometimes the movement speed is way too high because of lagspikes..CAP the movedirection SPEED
if (lastJump < Time.realtimeSinceStartup - 0.5f && (Input.GetButton("Jump") || Input.GetKeyDown(KeyCode.UpArrow)) && GameManager.AllowInput())
{
lastJump = Time.realtimeSinceStartup;
moveDirection.y = jumpSpeed;
}
//lastHorInput = horInput;
//lastVerInput = verInput;
}
else
{
//Mid air
if (GameManager.AllowInput())
{
horInput = 0; // Input.GetAxisRaw("Vertical");
verInput = Input.GetAxisRaw("Horizontal");
if (horInput == 0 && verInput == 0)
{
Vector3 desiredMoveDirection = new Vector3(0, moveDirection.y, 0);
moveDirection = Vector3.Lerp(moveDirection, desiredMoveDirection, Time.deltaTime * 2);
}
}
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime; // Mathf.Clamp(moveDirection.y - gravity * Time.deltaTime, -20, 20);
// Move the controller
CollisionFlags flags= controller.Move(moveDirection * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
transCache.position = new Vector3(transCache.position.x, transCache.position.y, spawnPos.z);
}
void Update()
{
if (transCache.position.y < -10)
{
Died();
}
}
public void Died()
{
Reset();
}
public void Reset(){
moveDirection = Vector3.zero;
transCache.position = spawnPos;
}
}
(C) Æliens
04/09/2009
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.