과제

[Unity3D,C#] 게임개발 숙련 팀 프로젝트 1일차

leejiyoung0511 2025. 3. 12. 21:01

🎯이번 프로젝트 목표

  • 디자인 패턴 적극활용
  • 객체 지향 구조로 코드 작성
  • 예외처리 코드 작성
  • 최대한 최적화 해보기

👩🏻‍💻오늘 할일

  • 자원 획득과 가공 시스템을 위한 사전 준비

데이터 관리는 ScriptableObject

ItemData클래스를 만들어서 WeaponData FoodData가 ItemData를 상속받게 하였다.

 

▼아이템 관리 클래스 다이어그램

 

[System.Serializable] 과 struct(구조체) 를 활용하여

 

인스펙터에서 값을 설정할수있게 해주었다.

 

이 다음에는 자원 획득 가능한 오브젝트 데이터도 ScriptableObject로 만들어주었다.

그리고 interface도 미리 작성해두었다.

public interface IInteractable // 상호작용 인터페이스
{
    public string GetInfo();     //설명 표시
    public void Interact();      // 상호작용을 실행
}

public interface IDroppable // 아이템 드롭 인터페이스
{
    public void Drop(Vector3 hit,Vector3 normal);     //아이템 드롭
}

public interface IEatable // 음식 섭취 인터페이스
{
    public void Eat();    //음식 섭취
}

public interface IEquippable //장착 인터페이스
{
    public void Equip();     //장착
    public void UnEquip();    //장착 해제
}

 

작성해둔 인터페이스를 활용하여 돌 스크립트의 기반을 작성해보았다.

public class Rock : MonoBehaviour, IInteractable
{
    [SerializeField]
    private ItemData resourceData; //획득 자원 데이터

    [SerializeField]
    private ResourceNodeData nodeData; //채집 가능한 오브젝트 데이터

    private int rockHp; //돌 오브젝트의 체력 
    private int rockYield; //채집 한번에 획득하는 자원갯수

    private void Start()
    {
        rockHp = NodeData.Hp;
        rockYield = NodeData.Yield;
    }

    public string GetInfo()
    {
        //TODO : 인벤토리에 아이템을 최대소지수 만큼 가지고 있으면 더이상 채집 못한다고 표시
        return $" F키를 눌러 채집";
    }

    //상호 작용 실행
    public void Interact()
    {
        rockHp -= rockYield;
        //TODO : 인벤토리에 추가
        //TODO : 인벤토리에 아이템을 최대소지수 만큼 가지고 있으면 채집 불가
        Debug.Log($"인벤토리에{resourceData.ItemName}을 인벤토리에 추가하였습니다!");

        if (rockHp <= 0) //더이상 채집 불가능하면
        {
            Destroy(gameObject); //오브젝트 파괴
        }
    }
}