You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

229 lines
5.4 KiB

using UnityEngine;
using System.Collections;
public class thirdPersonController : MonoBehaviour {
public string CAMERA_INPUT_X;
public string CAMERA_INPUT_Y;
public string MOVEMENT_INPUT_X;
public string MOVEMENT_INPUT_Y;
public string JUMP_INPUT;
public Animator animator;
public Camera camera;
public GameObject cameraCentre;
public float cameraSpeedX = 250.0f;
public float cameraSpeedY = 120.0f;
public float cameraDistance = 10.0f;
public float maxY = 80;
public float minY = -20;
public bool active = true;
public float movementSpeed;
public bool movementLock;
public float jumpHeight;
public float grip;
public float maxVelocity;
public float maxAirVelocity;
private float curMaxVelocity;
public bool slowed;
private float curSpeed;
public float cameraX;
public float cameraY;
private float movementX;
private float movementY;
private bool grounded;
private Rigidbody rigidbody;
public Collider curCollider;
public RaycastHit hit;
// Use this for initialization
void Start () {
rigidbody = GetComponent<Rigidbody> ();
cameraX = camera.transform.eulerAngles.x;
cameraY = camera.transform.eulerAngles.y;
}
void FixedUpdate(){
RaycastHit hit;
RaycastHit hit2;
Vector3 pos1 = transform.position + (-transform.right * 0.7f) + (transform.forward*0.4f); //+ (transform.forward*0.2f);
Vector3 pos2 = transform.position + (-transform.right * 0.7f) +(-transform.forward*0.4f);
Ray ray = new Ray(pos1, -Vector3.up);
Ray ray2 = new Ray (pos2, -Vector3.up);
Debug.DrawRay (pos1, -Vector3.up * 1.3f);
Debug.DrawRay (pos2, -Vector3.up * 1.3f);
if (Physics.Raycast (ray, out hit, 1.3f) || Physics.Raycast (ray2, out hit2, 1.3f)) {
grounded = true;
curMaxVelocity = maxVelocity;
//if (hit.collider.tag == "moveable"||hit2.collider.tag == "moveable")
// matchVelocity(hit.collider);
} else {
grounded = false;
curMaxVelocity = maxAirVelocity;
animator.SetBool ("Jump", false);
}
this.hit = hit;
if (hit2.collider != null)
this.hit = hit2;
if (slowed)
curSpeed = 700.0f;
else
curSpeed = movementSpeed;
if (active) {
applyMovement ();
Vector3 checkVelocity = rigidbody.velocity;
//Debug.Log ("VelMag: " + checkVelocity.magnitude);
if (checkVelocity.magnitude > maxVelocity){
float vertVelo = checkVelocity.y;
checkVelocity = Vector3.ClampMagnitude (checkVelocity, curMaxVelocity);
checkVelocity.y = vertVelo;
//Debug.Log (checkVelocity);
rigidbody.velocity = checkVelocity;
}
transform.rotation = Quaternion.Euler (new Vector3 (0.0f, camera.transform.rotation.eulerAngles.y, 0.0f));
applyGrip();
applyJump (jumpHeight);
}
animator.SetBool ("Grounded", grounded);
animator.SetFloat("Run speed",new Vector3 (rigidbody.velocity.x, 0.0f,rigidbody.velocity.z ).magnitude * Mathf.Sign(movementY));
Vector3 side = transform.InverseTransformDirection (rigidbody.velocity).normalized;
animator.SetFloat ("Side",side.x);
rigidbody.AddForce (new Vector3 (0.0f, -9.81f,0.0f));
curCollider = null;
}
//}
// Update is called once per frame
void LateUpdate () {
if (active) {
cameraX += Input.GetAxis (CAMERA_INPUT_X) * cameraSpeedX * 0.02f;
cameraY += Input.GetAxis (CAMERA_INPUT_Y) * cameraSpeedY * 0.02f;
}
cameraY = ClampAngle (cameraY, minY, maxY);
Quaternion cameraRotation = Quaternion.Euler (cameraY, cameraX, 0.0f);
Vector3 cameraPosition = cameraRotation * new Vector3(0.0f, 0.0f, -cameraDistance) + cameraCentre.transform.position;
camera.transform.rotation = cameraRotation;
camera.transform.position = cameraPosition;
}
private void applyMovement(){
movementX = Input.GetAxis (MOVEMENT_INPUT_X);
movementY = Input.GetAxis (MOVEMENT_INPUT_Y);
if (movementLock) {
movementX = 0;
if (movementY < 0 && this.name == "Player2")
movementY = 0;
if (movementY > 0 && this.name == "Player1")
movementY = 0;
}
Vector3 velocity = new Vector3 (movementX, 0.0f, movementY) * curSpeed * Time.deltaTime;
//Debug.Log (velocity);
velocity = Quaternion.Euler (0.0f, camera.transform.rotation.eulerAngles.y, 0.0f) * velocity;
rigidbody.AddForce (velocity);
}
private void applyJump(float power){
if (grounded) {
if (Input.GetButtonDown (JUMP_INPUT)) {
rigidbody.AddRelativeForce (0, power, 0);
animator.SetBool ("Jump", true);
}
}
}
private void matchVelocity(Collider target){
//Debug.Log ("matching velocity");
//Vector3 velocity = rigidbody.velocity;
//velocity = target.attachedRigidbody.velocity;
//rigidbody.velocity = velocity;
//transform.parent = target.transform;
//rigidbody.isKinematic = true;
}
public void applyGrip(){
float localVelX = transform.InverseTransformDirection (rigidbody.velocity).x;
float localVelZ = transform.InverseTransformDirection (rigidbody.velocity).z;
//Debug.Log ("velocity.y: " + localVelZ);
if (grounded && Mathf.Abs(movementX) < 0.8f ) {
rigidbody.AddForce(transform.right * -localVelX * grip);
if (Mathf.Abs(movementY) < 0.5f && Mathf.Abs(localVelZ )> 1.0f){
rigidbody.AddForce(-transform.forward * grip * localVelZ );
}
}
}
void OnCollisionStay(Collision col) {
if (col.transform.tag == "moveable")
curCollider = col.collider;
}
private static float ClampAngle (float angle, float min, float max) {
if (angle < -360)
angle += 360;
if (angle > 360)
angle -= 360;
return Mathf.Clamp (angle, min, max);
}
}