로그라이크나 탑다운 슈팅 게임에서 사용할 수 있는 스크립트 입니다.
벽에 가려지지 않은 몬스터들 중에서 가장 가까운 몬스터를 반환하는 스크립트입니다.
[전체 코드]
public Transform Target()
{
Transform result = null;
GameObject[] activating_monsters = GameObject.FindGameObjectsWithTag("Monster");
List<GameObject> ray_hitted_monsters = new List<GameObject>();
foreach (GameObject monster in activating_monsters)
{
RaycastHit2D ray_hit = Physics2D.Raycast(transform.position, monster.transform.position - transform.position, 1000, (-1) - (1 << LayerMask.NameToLayer("Player")));
if (ray_hit.collider.tag == "Monster")
{
ray_hitted_monsters.Add(ray_hit.collider.gameObject);
}
}
if (ray_hitted_monsters.Count > 0)
{
result = ray_hitted_monsters[0].transform;
float distance_with_monster = Vector2.Distance(transform.position, result.transform.position);
foreach (GameObject monster in ray_hitted_monsters)
{
float distance = Vector2.Distance(transform.position, monster.transform.position);
if (distance < distance_with_monster)
{
result = monster.transform;
distance_with_monster = distance;
}
}
}
return result;
}
Transform result = null;
GameObject[] activating_monsters = GameObject.FindGameObjectsWithTag("Monster");
List<GameObject> ray_hitted_monsters = new List<GameObject>();
result = 반환해야하는 값
activating_monsters = 현재 씬에 Monster 태그가 붙어있는 모든 몬스터들
- 로그라이크에 사용하려면 맵 이동 시에 activating_monsters를 설정해주면 됩니다.
- 현재는 테스트 중이므로 임의로 사용한 코드입니다.
ray_hitted_monsters = 벽에 가려져있지 않은 몬스터들
foreach (GameObject monster in activating_monsters)
{
RaycastHit2D ray_hit = Physics2D.Raycast(transform.position, monster.transform.position - transform.position, 1000, (-1) - (1 << LayerMask.NameToLayer("Player")));
if (ray_hit.collider.tag == "Monster")
{
ray_hitted_monsters.Add(ray_hit.collider.gameObject);
}
}
모든 몬스터들 중 RaycastHit2D를 활용하여 Monster 태그가 붙어있으면 ray_hitted_monsters에 저장합니다.
무기가 플레이어 자식 오브젝트로, 플레이어 중심으로 실행되기 때문에 Player 레이어는 제외하고 실행합니다.
if (ray_hitted_monsters.Count > 0)
{
result = ray_hitted_monsters[0].transform;
float distance_with_monster = Vector2.Distance(transform.position, result.transform.position);
foreach (GameObject monster in ray_hitted_monsters)
{
float distance = Vector2.Distance(transform.position, monster.transform.position);
if (distance < distance_with_monster)
{
result = monster.transform;
distance_with_monster = distance;
}
}
}
만약 모든 몬스터 중 벽에 가려지지 않은 몬스터가 있다면 실행되는 코드입니다.
ray_hitted_monsters 중 가장 가까운 거리의 몬스터를 찾는 스크립트 입니다.
'Unity' 카테고리의 다른 글
[Unity] 조이스틱으로 플레이어 이동 (2) | 2023.11.10 |
---|