using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Animations; using Saltosion.OneWeapon.Effects; using Saltosion.OneWeapon.Utils; using Saltosion.OneWeapon.Guns; namespace Saltosion.OneWeapon.Player { public class PlayerController : MonoBehaviour { public Rigidbody2D Body; public Transform Hand; public Transform SubHand; public AcceleratedMovement Movement; public SpriteRenderer BodySprite; public Animator BodyAnim; public SpriteRenderer HeadSprite; public Animator HeadAnim; public Transform HandLeft; public Transform HandRight; public Transform HandMiddle; public CameraFX CameraFX; public PunchingHand PunchingHand; public PlayerFun PlayerFun; public Gun Gun { private set; get; } private Vector2 GunLocation = new Vector2(0, -0.6f); private Vector3 GunRotation = new Vector3(0, 0, -90); private bool IsHoldingShoot = false; public float HandRetractSpeed = 10; public float HandRotationRetractSpeed = 300; private float CurrentHandRotation = 0f; private float CurrentHandDistance = 0f; public bool IsMoving { private set; get; } = false; void Update() { float X = Input.GetAxis("Horizontal"); float Y = Input.GetAxis("Vertical"); Movement.Direction = new Vector2(X, Y).normalized; Vector3 MousePos = Input.mousePosition; Vector3 PointedPos = Camera.main.ScreenToWorldPoint(MousePos); Vector2 LookDirection = (PointedPos - Hand.position).normalized; Vector3 Rot = Hand.localEulerAngles; Rot.z = Mathf.Atan2(LookDirection.y, LookDirection.x) * Mathf.Rad2Deg + 90; Hand.localEulerAngles = Rot; float Rotation = Rot.z; if (Rotation >= 45 && Rotation < 135) { BodyAnim.Play("HorizontalBody"); BodySprite.flipX = false; HeadAnim.Play("HeadRight"); HeadSprite.flipX = false; Hand.localPosition = HandMiddle.localPosition; } else if (Rotation >= 225 || Rotation < -45) { BodyAnim.Play("HorizontalBody"); BodySprite.flipX = true; HeadAnim.Play("HeadRight"); HeadSprite.flipX = true; Hand.localPosition = HandMiddle.localPosition; } else { if (Rotation >= 135 && Rotation < 225) { HeadAnim.Play("HeadUp"); Hand.localPosition = HandRight.localPosition; } else { HeadAnim.Play("HeadDown"); Hand.localPosition = HandLeft.localPosition; } BodyAnim.Play("VerticalBody"); BodySprite.flipX = false; HeadSprite.flipX = false; } if (Gun != null) { if (Rotation >= 180 || Rotation <= -45) { Gun.FlipGun(true); } else if (Rotation < 180 || Rotation > 45) { Gun.FlipGun(false); } } if (Movement.SpeedPercentage > 0.05) { IsMoving = true; } else { IsMoving = false; } BodyAnim.SetFloat("Speed", Movement.AnimationSpeed); HeadAnim.SetFloat("Speed", Movement.AnimationSpeed); bool Shoot = Input.GetButton("Shoot"); if (Shoot) { if (Gun != null) { if (Gun.Shoot(LookDirection, Rotation, IsHoldingShoot)) { CameraFX.StopFor(0.03f); CameraFX.ScreenShake(4f); PlayerFun.ShootingFun(); } } else if (CurrentHandDistance <= 0 && !IsHoldingShoot) { CurrentHandDistance = 1.5f; CurrentHandRotation = 55; PunchingHand.Punching = true; PlayerFun.ShootingFun(); } IsHoldingShoot = true; } if (Input.GetButtonUp("Shoot")) { IsHoldingShoot = false; } if (CurrentHandDistance > 0) { CurrentHandDistance -= HandRetractSpeed * Time.deltaTime; CurrentHandDistance = Mathf.Max(CurrentHandDistance, 0); } else { PunchingHand.Punching = false; } if (CurrentHandRotation > 0) { CurrentHandRotation -= HandRotationRetractSpeed * Time.deltaTime; CurrentHandRotation = Mathf.Max(CurrentHandRotation, 0); } Vector3 HandPosition = SubHand.localPosition; HandPosition.y = -CurrentHandDistance; SubHand.localPosition = HandPosition; Vector3 HandRotation = SubHand.localEulerAngles; HandRotation.z = CurrentHandRotation; SubHand.localEulerAngles = HandRotation; bool Drop = Input.GetButtonDown("DropWeapon"); if (Gun != null && Drop) { SetGun(null); } } public void SetGun(Gun gun) { PlayerFun.ReceiveNewWeapon(); if (Gun != null) { Destroy(Gun.gameObject); } Gun = gun; if (gun != null) { Gun.transform.parent = Hand; Gun.transform.localPosition = GunLocation; Gun.transform.localEulerAngles = GunRotation; } } } }