공격 시스템 구현
프리팹 (Prefab)
- 프리팹은 Unity 게임 엔진에서 사용되는 게임 오브젝트를 재사용 가능하고 관리하기 쉽게 만들기 위한 템플릿
- 프리팹을 사용하면 게임 오브젝트와 그에 관련된 컴포넌트 및 설정을 미리 정의하고, 여러 장면이나 게임에서 재사용할 수 있다.
- 프리팹은 인스턴스화를 통해 실제 게임 오브젝트로 변환될 수 있으며, 이 때 모든 프로퍼티와 컴포넌트 설정이 복사된다.
- 프리팹의 변경사항은 모든 인스턴스에 즉시 반영되므로, 일관성을 유지하고 일괄적인 업데이트를 쉽게 할 수 있다.
- 프리팹은 레벨 디자인, 재사용 가능한 게임 요소(캐릭터, 아이템, 장애물 등)의 생성, 프로토타이핑 등에 주로 사용된다.
Instantiate 함수 (Unity)
- Instantiate 함수는 Unity에서 제공하는 메소드로, 주어진 원본 개체의 복사본을 새로 생성하고 이를 반환
- 이 함수는 주로 게임 오브젝트, 즉 캐릭터, 아이템, 프로젝타일 등을 동적으로 게임 세계에 추가할 때 사용
- Instantiate 함수는 원본 개체의 모든 컴포넌트와 그 프로퍼티를 복사하여 새 게임 오브젝트를 생성
- 이 함수를 통해 생성된 게임 오브젝트는 독립적이며, 원본 개체에 대한 변화는 이에 영향을 주지 않는다.
- Instantiate 함수는 원본 게임 오브젝트, 위치 및 회전 정보를 인자로 받을 수 있다.
공격 시스템과 총알 만들기
PlayerInputController 수정
public void OnFire(InputValue value)
{
Debug.Log("OnFire" + value.ToString());
IsAttacking = value.isPressed;
}
TopDownCharacterController 수정
---------- 생략 ----------
public event Action OnAttackEvent;
private float _timeSinceLastAttack = float.MaxValue;
protected bool IsAttacking { get; set; }
protected virtual void Update()
{
HandleAttackDelay();
}
private void HandleAttackDelay()
{
if(_timeSinceLastAttack <= 0.2f) // TODO
{
_timeSinceLastAttack += Time.deltaTime;
}
if(IsAttacking && _timeSinceLastAttack > 0.2f)
{
_timeSinceLastAttack = 0;
CallAttackEvent();
}
}
---------- 생략 ----------
public void CallAttackEvent()
{
OnAttackEvent?.Invoke();
}
TopDownShooting 만들기
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TopDownShooting : MonoBehaviour
{
private TopDownCharacterController _contoller;
[SerializeField] private Transform projectileSpawnPosition;
private Vector2 _aimDirection = Vector2.right;
public GameObject testPrefab;
private void Awake()
{
_contoller = GetComponent<TopDownCharacterController>();
}
// Start is called before the first frame update
void Start()
{
_contoller.OnAttackEvent += OnShoot;
_contoller.OnLookEvent += OnAim;
}
private void OnAim(Vector2 newAimDirection)
{
_aimDirection = newAimDirection;
}
private void OnShoot()
{
CreateProjectile();
}
private void CreateProjectile()
{
Instantiate(testPrefab, projectileSpawnPosition.position,Quaternion.identity);
}
}
Player에 추가
Arrow 만들기
다음과 같이 오브젝트 구성
다음과 같은 경로 생성 후 드래그 앤 드랍 → 프리팹 생성
Scene - Arrow 삭제
Player - TopDown Shooting - Test Prefab 에 연결
'TIL' 카테고리의 다른 글
12.07 (TIL-Unity) (0) | 2023.12.07 |
---|---|
12.06 (TIL-코딩문제) (0) | 2023.12.06 |
12.04 (TIL-코딩문제) (1) | 2023.12.04 |
12.01 (TIL-Unity) (0) | 2023.12.01 |
11.30 (TIL-코딩문제) (0) | 2023.11.30 |