평화롭게(촉박하게) 유니티로 공부중이었는데 술술 해나가던 중 뭔가 이상하다.
기본적으로 게임은 조작키(방향키 혹은 asdw)로 움직이고 캐릭터와 무기는 마우스 커서가 있는쪽으로 보게된다.
무기와 관련한 스크립트는 여러가지가 있었는데 무기가 움직이는 원리에 대해서는 아래와 같다.
BaseController클래스와 자식 클래스인 PlayerController,
BaseController는 기본적인 캐릭터 행동(이동, 회전 등)을 처리하며
PlayerController에는 플레이어의 조작과 관련된 로직을 처리한다.
- Weapon(무기)은 WeaponPivot의 자식 오브젝트이다 (Weapon 자체는 프리펩화 시켰으나 게임 재생 시에는 자식 오브젝트로 들어오게 된다)
public class BaseController : MonoBehaviour
{
// weponPivot은 무기가 따라갈 위치를 저장하는 transForm, [SerializeField]덕에 유니티에서 직접 설정 가능
[SerializeField] private Transform weaponPivot;
private void Rotate(Vector2 direction)
{
// 캐릭터가 direction을 바라보게 할 회전 각도를 구함
float rotZ = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
// 90도 이상이면 왼쪽을 보고있는것, 좌우반전
bool isLeft = Mathf.Abs(rotZ) > 90f;
characterRenderer.flipX = isLeft;
// weponPivot이 존재하면 무기의 z축 회전을 rotZ값으로 설정, 무기도 캐릭터가 보는 방향으로 회전하도록 만듬
if (weaponPivot != null)
{
weaponPivot.rotation = Quaternion.Euler(0, 0, rotZ);
}
// 무기가 좌우 방향에 따라 반전되도록 설정
weaponHandler?.Rotate(isLeft);
}
}
- 캐릭터가 바라보는 방향과 함께 무기도 바라보게 함, 바라보는 곳은 마우스가 있는 위치
자 이제 캐릭터가 바라보는 방향과 함께 무기도 같이 움직여야 하는데
활은 원거리 무기인데 내 캐릭터는 그냥 휘둘러서 때리고 다닐 생각만 하는것 같다...
게임 재생을 한 상태에서 포지션 값도 보고 했는데 Y값만 하루종일 움직이고 있어 활이 휘두르는 것이 되었고 왜 저러고 있는지 정말 모르겠어서 이곳저곳 코드도 보고 했는데 결국 혼자 해결하지 못하고 도움을 요청드리러 다녀왔다..
결론부터 말하자면 코드에는 문제가 없었고 유니티 내에서 내가 값을 잘못 입력해 둔 것이었다.
무기 위치를 살짝 조정해주기 위해 Position의 값을 살짝 조정해두었었는데, 이것이 문제였다.
무기 회전/위치는 WeaponPivot 오브젝트를 기준으로 이루어지는데 이때 무기의 위치(localPosition)은 WeaponPivot을 기준으로 설정된다. 이를 바탕으로 WeaponPivot의 위치가 실제 무기의 회전 중심적으로 작용하게 되며, 무기의 localPosition은 이 중심점을 기준으로 계산된다.
내가 무기의 위치만을 움직이고 싶으면 움직여야하는것은 localPosition인 WeaponPivot의 Position값인 것이다.
근데 WeaponPivot의 위치가 다른곳에 배치되어 있다면 그 중심으로 회전이 이루어지는데, 내가 프리펩(Weapon)의 Position값을 건드려 중심점이 무기의 끝이 된것이었고 그리하여 저렇게 휘두르는 모습이 나왔던 것이었다...
그리고 어이없게도 이거 해결하고 6시간도 안되어서 같은 상황 만들고 이거 이상해요(ノへ ̄、) 했다..
축제열렸니...? 원래는 자그마하게 나와야 하는 이펙트인데 내 화면에선 아주 파티가 열렸다.
파티클 이펙트 오브젝트의 값은 30분동안 눈빠지게 확인했는데 잘못된게 없었는데.. 부모 오브젝트가 문제였다.
부모 오브젝트의 Position값이 0이 아니었으며 이로인해 자식 오브젝트인 파티클 시스템도 영향을 받아 더 멀리 더 크게 생성되고 있는 것이었다....
파티클의 경우 부모의 scale이 커지면 파티클 시스템 크기도 그만큼 커지며 부모 영향을 받아 해당 효과는 예상보다 더 커지게 나왔던 것이었다.
localPosition과 오브젝트 간의 원리에 대해서 대략은 알게 되었으나 이것을 완벽히 이해하기 위해서는 부모/자식 오브젝트 간의 Transform이 어떻게 작동하는지에 대해 공부가 필요하다고 느끼게 되었다..
일단 오늘은 부모/자식 오브젝트간의 localPosition에 대해서 이해하였으니 다른 부분에 대해서는 계속 공부해가는걸로 하자!
'Unity > Unity Study' 카테고리의 다른 글
[Unity] 쿠키런 모작 팀 프로젝트 중, Item 1 - 기본 아이템 구현 (트러블) (0) | 2025.02.26 |
---|---|
[Unity] 트러블 슈팅 : Say_Gamja 기능 일부 (0) | 2025.02.20 |
[Unity] '카드 뒤집기 게임' 의 기능 추가 (0) | 2025.02.05 |
[Unity] 네번째 게임, '카드 뒤집기 게임' 완성 (0) | 2025.02.04 |
[Unity] 세번째 게임, '고양이 밥주기 게임' 완성 (0) | 2025.01.28 |