본문 바로가기
TIL

12.05 (TIL-Unity)

by 오랑이귀엽다 2023. 12. 5.

공격 시스템 구현

프리팹 (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