PlayerController2D.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using UnityEngine;
  2. namespace DunGen.Demo2D
  3. {
  4. sealed class PlayerController2D : MonoBehaviour
  5. {
  6. public float MovementSpeed = 6f;
  7. private new CircleCollider2D collider;
  8. private RaycastHit2D[] hitBuffer;
  9. private DungeonGenerator dungeonGenerator;
  10. private void Start()
  11. {
  12. collider = GetComponent<CircleCollider2D>();
  13. hitBuffer = new RaycastHit2D[10];
  14. var gen = UnityUtil.FindObjectByType<DunGen.Demo.Generator>();
  15. dungeonGenerator = gen.DungeonGenerator.Generator;
  16. dungeonGenerator.OnGenerationStatusChanged += OnGeneratorStatusChanged;
  17. }
  18. private void OnDestroy()
  19. {
  20. dungeonGenerator.OnGenerationStatusChanged -= OnGeneratorStatusChanged;
  21. }
  22. private void OnGeneratorStatusChanged(DungeonGenerator generator, GenerationStatus status)
  23. {
  24. transform.position = Vector3.zero;
  25. }
  26. private void Update()
  27. {
  28. Vector2 input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
  29. if(input.sqrMagnitude > 1f)
  30. input.Normalize();
  31. Vector3 direction = new Vector3(input.x, input.y, 0f);
  32. float distance = MovementSpeed * Time.deltaTime;
  33. Vector3 motion = direction * distance;
  34. int hitCount = collider.Cast(direction, hitBuffer, distance);
  35. for (int i = 0; i < hitCount; i++)
  36. {
  37. var hit = hitBuffer[i];
  38. if(hit.collider.isTrigger)
  39. continue;
  40. motion = direction * hit.distance;
  41. break;
  42. }
  43. transform.position += motion;
  44. }
  45. }
  46. }