안녕하세요
유니티 초짜입니다.
2D 게임을 만들고 있는데요.
수직방향으로 일정 거리만큼 레이를 쏴서, 바닥을 검사하고싶은데
레이 방향이 자꾸만 이상하게 나옵니다.
코드는 아래와 같습니다.
한시간째 헤딩중인데 머리가 너무 아픕니다. ㅠㅠ 도와주세요.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | public class GroundManager2D : MonoBehaviour { #region FieldVariables private GameObject Actor; private GameObject Father; private Ray2D Ray2d; private RaycastHit2D RayHit2D; [SerializeField] private LayerMask GroundLayer; [SerializeField] private float RayDistance; #endregion #region MainFunctions void Initialize() { Actor = this.gameObject; Father = Actor.transform.parent.gameObject; Ray2d = new Ray2D(Actor.transform.position, -Actor.transform.up); RayHit2D = Physics2D.Raycast(Ray2d.origin, Ray2d.direction, RayDistance, GroundLayer); RayDistance = 1.0f; } IEnumerator RayChecker() { WaitForSeconds WFSec = new WaitForSeconds(0.2f); while(true) { GroundChanger(); yield return WFSec; } } void GroundChanger() { if (Physics2D.Raycast(Ray2d.origin, Ray2d.direction, RayDistance, GroundLayer) == true) { Father.transform.parent = RayHit2D.collider.gameObject.transform; } } #endregion // 확인용. void OnDrawGizmos() { Gizmos.color = Color.red; Gizmos.DrawLine(Actor.transform.position, Actor.transform.up); } void Awake() { Initialize(); StartCoroutine(RayChecker()); } } | cs |
실제로 저렇게 발사되는건지 여부조차도 모르겠습니다. Debug.DrawRay 라는건 아예 작동조차 안해서...예전부터 벡터가 항상 발목을 잡았었는데 이번에도 역시나...ㅜㅠ
transform.up은 자기의 로컬좌표계에서 y축의 방향을 가리킴. 그러니까 Actor가 회전하면 transform.up도 바뀜. 항상 아래쪽으로 레이를 쏘길 원하면 Actor.transform.up 대신에 Vector3.up을 쓰셈
2D니까 Vector2.up이겠네
와...미치겠네...바꿔봐도 결과가 비슷하게 나와요.... 지금 이 오브젝트가 자식오브젝트구요, Ray2d 는 월드좌표를 쓴다는데 로컬로 바꿔줘야된다던가 그런건 아닐까요? ㅠㅠ
근데 저 코드보면 RayHit2D는 Initialize()에서 한번 레이캐스트한 결과만 갖고 있고, GroundChecker()에서는 갱신이 안되는거 같은데
Father.transform.parent = Physics2D.Raycast(Actor.transform.position, -Actor.transform.up - Actor.transform.position).transform.gameobject; 이런식으로 만드셔도 작동은 될겁니다
new vector2 로 하니까 잘 됩니다. 답변 고마워요~