using System; using System.Collections; using System.Collections.Generic; using PlayerInput; using UnityEngine; [SelectionBase] public class PlayerController : MonoBehaviour { public float Speed = 5; public float Gravity = 7; private CharacterController charC; private AnimationHandler anim; // Use this for initialization void Start () { charC = GetComponent<CharacterController>(); anim = GetComponent<AnimationHandler>(); } private float velY = 0; public float RunCycleTime = 0.8f; public float RunFrameTime = 0.3f; public float RunFrameSpeedBoost = 1.4f; private float runCycle = 0.0f; // Update is called once per frame void Update () { Vector3 pos = transform.position; Vector3 dir = new Vector3(); if (input != null) { if (charC.isGrounded) { dir.x = input.Axis(InputSource<PlayerController>.InputAxis.MoveX); dir.z = input.Axis(InputSource<PlayerController>.InputAxis.MoveY); if (dir.magnitude > 0.3f) { dir.Normalize(); float speed = Speed; if (runCycle < RunFrameTime) { speed *= RunFrameSpeedBoost; } dir *= speed; float angle = Mathf.Atan2(dir.z, dir.x); if (angle < 0) angle += Mathf.PI * 2; if (angle < Mathf.PI / 2.0f) anim.SetDir(AnimationHandler.Direction.UpRight); if (angle < Mathf.PI && angle >= Mathf.PI / 2.0f) anim.SetDir(AnimationHandler.Direction.UpLeft); if (angle < Mathf.PI * 3.0f / 2.0f && angle >= Mathf.PI) anim.SetDir(AnimationHandler.Direction.DownLeft); if (angle >= Mathf.PI * 3.0f / 2.0f) anim.SetDir(AnimationHandler.Direction.DownRight); //Debug.Log("ANGLE: " + angle); runCycle += Time.deltaTime; while (runCycle >= RunCycleTime) { runCycle -= RunCycleTime; } int frame = runCycle < RunFrameTime ? 1 : 0; anim.SetFrame(frame); } else { dir.x = 0; dir.z = 0; anim.SetFrame(0); runCycle = 0.0f; } } } dir.y = velY; velY -= Gravity * Time.deltaTime; gameObject.layer = LayerMask.NameToLayer("player_controller_no_collide"); charC.Move(dir * Time.deltaTime); gameObject.layer = LayerMask.NameToLayer("player_controller"); if (charC.isGrounded) { velY = 0; } Vector3 moved = transform.position - pos; if (moved.magnitude > 0.7f * Time.deltaTime) { float radius = 0.6f; int layer = LayerMask.GetMask("leaf"); foreach (Collider c in Physics.OverlapSphere(transform.position, radius, layer)) { LeafPhysics leaf = c.GetComponentInParent<LeafPhysics>(); if (leaf != null) { Vector3 toLeaf = leaf.transform.position - transform.position; float dist = toLeaf.magnitude; float power = Mathf.Pow(1.0f - dist / radius, 2.0f) * Time.deltaTime * 300; //toLeaf.Normalize(); toLeaf.y += UnityEngine.Random.Range(0.4f, 1.0f); leaf.Body.AddForce(toLeaf * (9.0f + UnityEngine.Random.Range(0, 9.0f)) * power); } } } } private InputSource<PlayerController> input = null; private InputManager.PlayerInfo playerInfo; public void SetInput(InputSource<PlayerController> newPlayerInput, InputManager.PlayerInfo playerInfo) { this.input = newPlayerInput; this.playerInfo = playerInfo; } }