로그라이크나 탑다운 슈팅 게임에서 사용할 수 있는 스크립트 입니다.

벽에 가려지지 않은 몬스터들 중에서 가장 가까운 몬스터를 반환하는 스크립트입니다.

 


[전체 코드]

    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

+ Recent posts