using System; using System.Linq; using Controllers.Player; using UnityEngine; namespace Controllers.Player { public class PlayerController : MonoBehaviour { [SerializeField] private PlayerSegment[] segments; [SerializeField] private float sensitivity; [SerializeField] private float verticalSensitivity; [SerializeField] private GameController game; [SerializeField] private Controls controls; [SerializeField] private float maxLegAngle; [SerializeField] private float legSpeed; private void Update() { // Loop over each body segment and control it. for (var i = 0; i < segments.Length; i++) { var segment = segments[i]; var isRoot = i == 0; var isTop = i == segments.Length - 1; // Update icons foreach (var control in new[] {segment.left, segment.right}) { if (Input.GetKeyDown(control.keyCode)) control.icon.SetActive(true); else if (Input.GetKeyUp(control.keyCode)) control.icon.SetActive(false); } // Add forces if (Input.GetKey(segment.left.keyCode)) { segment.Rigidbody.AddForceAtPosition( Vector2.left * (sensitivity * (isRoot ? 2f : 1f)) + Vector2.up * (verticalSensitivity * (isRoot ? -1f : 1f)), segment.transform.position + (segment.height * segment.forceOrigin)); } if (Input.GetKey(segment.right.keyCode)) { segment.Rigidbody.AddForceAtPosition( Vector2.right * (sensitivity * (isRoot ? 2f : 1f)) + Vector2.up * (verticalSensitivity * (isRoot ? -1f : 1f)), segment.transform.position + (segment.height * segment.forceOrigin)); } // Rotate the legs if we move. if (isRoot) { if (Input.GetKey(segment.left.keyCode) || Input.GetKey(segment.right.keyCode)) { segment.left.leg.transform.localRotation = Quaternion.Euler(0, 0, maxLegAngle * Mathf.Sin(Time.time * legSpeed)); segment.right.leg.transform.localRotation = Quaternion.Euler(0, 0, maxLegAngle * Mathf.Sin(Time.time * -legSpeed)); } else { segment.left.leg.transform.localRotation = Quaternion.Slerp(segment.left.leg.transform.localRotation, Quaternion.identity, Time.deltaTime * legSpeed); segment.right.leg.transform.localRotation = Quaternion.Slerp(segment.right.leg.transform.localRotation, Quaternion.identity, Time.deltaTime * legSpeed); } } if (isTop) { game.player.Move(segment.transform.position); // Point the arms at the ball. segment.left.arm.transform.up = -(game.ball.transform.position - segment.left.arm.transform.position); segment.right.arm.transform.up = -(game.ball.transform.position - segment.right.arm.transform.position); } } // Try grabbing the ball if pressed. if (Input.GetKeyDown(controls.grab)) { // Try grabbing at each segment, and then the segment can pass it up to the top guy. foreach (var segment in segments) { if (game.player.GrabBall(segment.transform.position)) break; // Stop after we successfully grab. } } // Try shooting the ball if pressed. if (Input.GetKeyDown(controls.shoot)) game.player.Shoot(segments.Last().transform); } [Serializable] private struct Controls { [SerializeField] internal KeyCode grab; [SerializeField] internal KeyCode shoot; } } }