프리팹은 Unity 게임 엔진에서 사용되는 게임 오브젝트를 재사용 가능하고 관리하기 쉽게 만들기 위한 템플릿, 프리셋
프리팹을 사용하면 게임 오브젝트와 그에 관련된 컴포넌트 및 설정을 미리 정의하고, 여러 장면이나 게임에서 재사용할 수 있음
프리팹은 인스턴스화를 통해 실제 게임 오브젝트로 변환될 수 있으며, 이 때 모든 프로퍼티와 컴포넌트 설정이 복사됨
프리팹의 변경사항은 모든 인스턴스에 즉시 반영되므로, 일관성을 유지하고 일괄적인 업데이트를 쉽게 할 수 있음
프리팹은 레벨 디자인, 재사용 가능한 게임 요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용됨
프리팹 만들기
- 프리팹을 만드려면 생성되어있는 게임오브젝트를 프로젝트 뷰로 옮기면 됨
- 게임오브젝트를 에셋으로 만듬
Instantiate 함수는 Unity에서 제공하는 메소드로, 주어진 원본 개체의 복사본을 새로 생성하고 이를 반환함
이 함수는 주로 게임 오브젝트, 즉 캐릭터, 아이템, 프로젝타일 등을 동적으로 게임 세계에 추가할 때 사용됨
Instantiate 함수는 원본 개체의 모든 컴포넌트와 그 프로퍼티를 복사하여 새 게임 오브젝트를 생성함
이 함수를 통해 생성된 게임 오브젝트는 독립적이며, 원본 개체에 대한 변화는 이에 영향을 주지 않음
Instantiate 함수는 원본 게임 오브젝트, 위치 및 회전 정보를 인자로 받을 수 있음
public void OnFire(InputValue value)
{
IsAttacking = value.isPressed;
}
---------- 생략 ----------
public event Action OnAttackEvent;
private float timeSinceLastAttack = float.MaxValue;
protected bool IsAttacking { get; set; }
protected virtual void Update()
{
HandleAttackDelay();
}
private void HandleAttckDelay()
{
// TODO : MAGIC NUMBER 수정
if(timeSinceLastAttack <= 0.2f)
{
timeSinceLastAttack += Time.deltaTime;
}
if(IsAttacking && timeSinceLastAttack > 0.2f)
{
timeSinceLastAttack = 0f;
CallAttckEvent();
}
}
---------- 생략 ----------
public void CallAttackEvent()
{
OnAttackEvent?.Invoke();
}
public class TopDownShooting : MonoBehaviour
{
private TopDownController controller;
[SerializeField] private Transform projectileSpawnPosition;
private Vector2 aimDirection = Vector2.right;
public GameObject TestPrefab;
private void Awake()
{
controller = GetComponent<TopDownController>();
}
private void Start()
{
controller.OnAttackEvent += OnShoot;
// OnLookEvent에 이제 두개가 등록되는 것 - 하나는 TopDownAimRotation.OnAim(Vec2)
// 한 개의 델리게이트에 여러 개의 함수가 등록되어있는 것을 multicast delegate라고 함.
// Action이나 Func도 델리게이트의 일종인 것 기억하시죠..?
controller.OnLookEvent += OnAim;
}
private void OnAim(Vector2 direction)
{
aimDirection = direction;
}
private void OnShoot()
{
CreateProjectile();
}
private void CreateProjectile()
{
// TODO :: 날라가질 않기 때문에 날라가게 만들 것임
Instantiate(TestPrefab, projectileSpawnPosition.position, Quaternion.identity);
}
}