MouseInteractionExample.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using System.Linq;
  2. using Assets.HeroEditor4D.Common.Scripts.CharacterScripts;
  3. using Assets.HeroEditor4D.Common.Scripts.Enums;
  4. using UnityEngine;
  5. namespace Assets.HeroEditor4D.Common.Scripts.ExampleScripts
  6. {
  7. public class MouseInteractionExample : MonoBehaviour
  8. {
  9. public Character4D Character;
  10. public void Start()
  11. {
  12. var firearm = Character.SpriteCollection.Firearm2H.Single(i => i.Name == "MP5L");
  13. Character.Equip(firearm, EquipmentPart.Firearm2H);
  14. Character.AnimationManager.SetState(CharacterState.Ready);
  15. Character.SetDirection(Vector2.down);
  16. }
  17. // We need LateUpdate() to override Animation transitions.
  18. public void LateUpdate()
  19. {
  20. SetDirection();
  21. RotateFirearm();
  22. }
  23. private void SetDirection()
  24. {
  25. var position = (Vector2) Camera.main.WorldToScreenPoint(Character.Active.AnchorBody.position);
  26. var angle = Vector2.SignedAngle((Vector2) Input.mousePosition - position, Vector2.up);
  27. var direction = Vector2.down;
  28. if (angle > -45 && angle <= 45) direction = Vector2.up;
  29. else if (angle > 45 && angle <= 135) direction = Vector2.right;
  30. else if (angle > -135 && angle <= 45) direction = Vector2.left;
  31. Character.SetDirection(direction);
  32. }
  33. private void RotateFirearm()
  34. {
  35. var armL = Character.Active.BodyRenderers.Single(i => i.name == "ArmL").transform;
  36. var armR = Character.Active.BodyRenderers.Single(i => i.name == "ArmR").transform;
  37. var weapon = Character.Active.PrimaryWeaponRenderer.transform;
  38. var rotation = GetArmRotation(armR);
  39. weapon.Rotate(0, 0, rotation * 2 / 4);
  40. rotation = GetArmRotation(armR);
  41. armL.Rotate(0, 0, rotation);
  42. armR.Rotate(0, 0, rotation);
  43. }
  44. private float GetArmRotation(Transform armR) // You should be a geometry ninja to understand this.
  45. {
  46. var muzzle = Character.Active.AnchorFireMuzzle;
  47. var alpha = Vector2.SignedAngle(armR.position - muzzle.position, muzzle.up);
  48. var magnitude = muzzle.InverseTransformPoint(armR.position).magnitude;
  49. var elbow = (Vector2) muzzle.TransformPoint(0, magnitude * Mathf.Cos(alpha * Mathf.Deg2Rad), 0);
  50. var angle = Vector2.SignedAngle((Vector2) muzzle.position - elbow, (Vector2) Camera.main.ScreenToWorldPoint(Input.mousePosition) - elbow);
  51. return angle;
  52. }
  53. }
  54. }