Development/Unity Engine

[Retro유니티] Bullet Spawner 구현 - Start()

사이바 미도리 2024. 11. 15. 11:30

3D Cylinder로 된 Bullet Spawner를 만들자.

일단 만드는건 대충 빠르게 만들고.

 

중요한건 script다.

 

BulletSpawner.cs

public <- 외부에서 재설정 가능.

-> 사용할 상수값(탄알 생성주기 최소값, 최대값)

-> 탄알생성에 쓸 원본 Prefab을 GameObject로 선언

 

private

-> 조준대상 GameObject의 Transform Component

-> 탄알생성주기

-> 마지막 탄알생성시점부터 흐른 시간

 

참고) Range 함수는 argument가 int면 int를, float면 float를 return한다.

 

target = FindObjectOfType<PlayerController>().transform;

=> PlayerController 타입의 Component를 보유한 GameObject를 찾고, 해당 GameObject의 TransformComponent를 찾아서 target에 할당한다.

 

참고) FindObjectOfType() 메서드의 처리비용

해당 함수는 Scene에 존재하는 모든 Object를 검색하여 원하는 타입의 오브젝트를 찾아낸다.

따라서, 처리비용이 크다.

따라서, Start() 메서드처럼 초기 한 두번만 실행되는 메서드에서만 사용해야 한다.

만약 Update() 메서드에서 FindObjectOfType을 사용한다면 심각하게 느려진 게임을 초래할 수 있다.

단일객체가 아니라 배열을 반환하는 함수로는 FindObjectsOfType이 있다.

 

의문) 혹시 PlayerController타입의 Component를 보유한 GameObject가 1개가 아니라 여러개라면 어떻게 돼?

코파일럿)

FindObjectOfType<T>() 메서드는 씬에서 지정된 타입의 첫 번째 활성화된 오브젝트를 반환합니다. 따라서 PlayerController 타입의 컴포넌트를 가진 여러 개의 게임 오브젝트가 있더라도, 이 메서드는 그 중 첫 번째 오브젝트만 반환합니다.
만약 PlayerController 타입의 컴포넌트를 가진 모든 게임 오브젝트를 찾고 싶다면, FindObjectsOfType<T>() 메서드를 사용해야 합니다. 이 메서드는 해당 타입의 모든 활성화된 오브젝트를 배열로 반환합니다.
예를 들어, 모든 PlayerController 타입의 컴포넌트를 가진 게임 오브젝트의 Transform 컴포넌트를 가져오려면 다음과 같이 할 수 있습니다.

using UnityEngine;

public class Example : MonoBehaviour
{
    void Start()
    {
        PlayerController[] playerControllers = FindObjectsOfType<PlayerController>();
        foreach (PlayerController playerController in playerControllers)
        {
            Transform target = playerController.transform;
            // target을 사용하여 원하는 작업 수행
        }
    }
}

 

 

의문) 첫번째 활성화된 오브젝트라고 했는데, 검색순서는 어떻게 정해져?

코파일럿)

FindObjectOfType<T>() 메서드가 반환하는 첫 번째 활성화된 오브젝트의 검색 순서는 Unity의 내부 구현에 따라 결정됩니다. 일반적으로는 씬 계층 구조에서 위쪽에 있는 오브젝트부터 검색됩니다. 그러나 이 순서는 보장되지 않으며, 특정 순서에 의존하는 코드를 작성하는 것은 권장되지 않습니다.
만약 특정 순서로 오브젝트를 검색해야 한다면, FindObjectsOfType<T>() 메서드를 사용하여 모든 오브젝트를 배열로 가져온 후, 원하는 순서로 정렬하거나 필터링하는 것이 좋습니다.
예를 들어, PlayerController 타입의 컴포넌트를 가진 모든 게임 오브젝트를 이름 순서로 정렬하여 검색하려면 다음과 같이 할 수 있습니다:

using UnityEngine;
using System.Linq;

public class Example : MonoBehaviour
{
    void Start()
    {
        PlayerController[] playerControllers = FindObjectsOfType<PlayerController>();
        var sortedPlayerControllers = playerControllers.OrderBy(pc => pc.gameObject.name).ToArray();

        foreach (PlayerController playerController in sortedPlayerControllers)
        {
            Transform target = playerController.transform;
            // target을 사용하여 원하는 작업 수행
        }
    }
}

 

 

참고) visual studio 주석달기

주석 달기 ctrl + k, ctrl + c