선생님들 유니티 무지랭이가 또 질문 들고 기어왔습니다..
요약
1.캐릭터에 무기를 통한 공격판정을 구현하려고 하는 중. 구현방법은 캐릭터 오브젝트 안에 무기 히트박스 역할을 할 오브젝트를 종속시키고 각각
다른 콜라이더를 부여했음(캐릭터 몸에 콜라이더 따로, 무기에 콜라이더 따로..)
요런식으로 캐릭터 안에 각각 무기히트박스용 오브젝트 넣어놓고 각 방향 공격시에만 활성화되게 해놓음
2.무기 콜라이더에 몬스터가 닿으면 몬스터가 피해를 입고, 캐릭터 본체에 몬스터가 닿으면 캐릭터가 피해를 입는 식으로 구현할 생각인데,
캐릭터와 무기 각각에 다른 태그를 넣었음에도 캐릭터가 무기를 안고가는 상위 오브젝트여서인지 캐릭터 몸 <-> 몬스터 접촉 로직이 무기에도 싸잡혀서 작동하고 있음
(무기와 적이 부딪혀도 몬스터의 피격로직이 아니라 캐릭터의 피격로직이 발동해서 공격하고도 몬스터는 멀쩡하고 캐릭터가 쳐맞는 상황이 나오고있는 상황)
3. 무기가 캐릭터 안에 종속되는 오브젝트라서 무기든 캐릭터든 싹 다 캐릭터로 인식되어서 무기<->몬스터간의 공격로직이 작동을 못하고 캐릭터 피격로직이 먼저 작동되어버리는것 같은데, 종속 오브젝트가 부모 오브젝트에게서 독립되는 개체 판정을 갖게 하려면 어떻게 해야 할까요
둘을 하이어라키 상에서 분리시키면 무기 히트박스가 캐릭터 따라가게 로직 짜는것도 귀찮을것 같고 일반적으론 종속시키는게 맞는것 같은데 방법을 모르겠음..
작성 코드
1.캐릭터 스크립트 - 충돌 관련 로직
private void OnCollisionEnter2D(Collision2D collision)
{
//"적"태그를 가진 대상과의 충돌이 입력되었을 때
if (collision.gameObject.tag == "Enemy")
{
//밟기 공격
//만약 캐릭터가 아래로 낙하중이고(낙하속도가 있다면) 몬스터보다 위에 있다면(y가 충돌위치보다 높다면)
if (Rigid.velocity.y < 0 && transform.position.y > collision.transform.position.y)
{
//충돌정보를 jumpattack 로직에 전달하면서 그를 작동시킨다.
JumpAttack(collision.transform);
}
else
{
//oncollision enter 2d의 충돌시 대상의 포지션정보를 대미지함수로 넘김과 동시에 그를 작동시킨다.
Damage(collision.transform.position);
}
}
}
//밟기 공격 로직
void JumpAttack(Transform enemy)
{
//밟을 시 반발력 부여
Rigid.AddForce(Vector2.up * 10 , ForceMode2D.Impulse);
//슬라임 스크립트를 호출
Slime EnemyMove = enemy.GetComponent<Slime>();
//공격 성립 시 슬라임 스크립트의 OnDamaged(피격)함수를 호출시킨다.
EnemyMove.OnDamaged();
}
//피격(대미지) 로직 (위에서 받은 충돌대상과의 포지션정보를 targetPos라는 벡터로 정의한다.)
void Damage(Vector2 targetPos)
{
//이 게임오브젝트(플레이어)의 레이어를 특정 번호(피격상태)로 바꾼다.
gameObject.layer = 9;
//캐릭터 스프라이트를 살짝 투명하게 바꿔준다.
Renderer.color = new Color(1, 0, 0, 0.4f);
//HitDir는 캐릭터와 타겟포지션(충돌대상의 정보)의 x값을 뺀 값으로, 그것이 0보다 크면 1, 아니면 -1을 반환한다.
float HitDir = transform.position.x - targetPos.x;
if(HitDir > 0)
{
KnockBack = 1f;
}
if(HitDir < 0)
{
KnockBack = -1f;
}
2.무기 스크립트 - 몬스터와의 충돌 로직
private void OnCollisionEnter2D(Collision2D collision)
{
//"적"태그를 가진 대상과 무기간의 충돌이 입력되면 접촉한 몬스터에게 몬스터 스크립트 상의 대미지 로직을 작동시킨다.
if (collision.gameObject.tag == "Enemy")
{
Slime.instance.OnDamaged();
}
}
3.몬스터 스크립트 - 피격 로직
public void OnDamaged()
{
//색을 붉게, 투명하게 바꾼다.
m_Sprite.color = new Color(1, 0, 0, 0.4f);
//HP를 1차감한다.
SlimeHp -= 1;
//몬스터 hp가 0이하가 되면
if(SlimeHp <= 0)
{
//게임매니저의 킬카운트에 1을 더한다.
GameManager.instance.KillCount += 1;
//스프라이트 y축을 뒤집는다
m_Sprite.flipY = true;
//적용된 콜라아더를 비활성화한다.
m_Collider.enabled = false;
//살짝 떴다가 떨어지길 바라므로 y축에 힘을 가해준다.
Rigid.AddForce(Vector2.up * 5, ForceMode2D.Impulse);
//일정시간 후 제거로직을 발동한다.
Invoke("DeActive", 5);
}
}
무기 오브젝트에 강체, 콜라이더, 제어스크립트 피격 오브젝트에 강체, 콜라이더, 제어스크립트 따로 관리하고 상위 오브젝트에서 따로 관리하는게 편할거같네요
피격 오브젝트는 몬스터라 이미 따로 되어있고, 무기오브젝트를 캐릭터 오브젝트 아래에 종속시킨건 그대로 유지한채로 리지드바디, 콜라이더, 스크립트 넣으면 될까요?
다른 사람인데 캐릭터 오브젝튼 자식으로 무기 오브젝트, 피격 오브젝트 따로 두란 뜻인듯. 캐릭터 오브젝트 자체어 피격 콜라이더를 두지 말고ㅇㅇ