Unity 내배캠 TIL

Unity 게임 개발 숙련 - (6주차4일)

오늘도즐겨 2024. 10. 29. 01:14

🔥 10/28 월요일 목표 🔥 

🔎  개인 프로젝트 필수구현 80% 완료 (체력바UI, 아이템프리펩, 아이템데이터, 스크립터블오브젝트 )

 

📌 체력바 UI

 

👀 Condition  Script

각각의 Condition 오브젝트에 스크립트 컴포넌트 추가

public class Condition : MonoBehaviour
{
    public float curValue;
    public float startValue;
    public float maxValue;
    public float passiveValue;
    public Image uiBar;

    void Start()
    {
        curValue = startValue;
    }
    
    void Update()
    {
        uiBar.fillAmount = GetPercentage();
    }

    float GetPercentage()
    { 
        return curValue/maxValue;
    }

    public void Add(float value)
    { 
        curValue = Mathf.Min(curValue + value, maxValue);
    }
    public void Subtract(float value) 
    {
        curValue = Mathf.Max(curValue -value, 0);
    }
}

👀 UICondition  Script

Condition 오브젝트 상위 Conditions 오브젝트에 컴포넌트 추가

public class UICondition : MonoBehaviour
{
    public Condition health;
    public Condition hunger;
    public Condition stemina;

    void Start()
    {
        CharacterManager.Instance.Player.condition.uiCondition = this;
    }
}

👀 PlayerCondition Script

Player 오브젝트에 컴포넌트 추가

public class PlayerCondition : MonoBehaviour
{
    public UICondition uiCondition;

    Condition health { get { return uiCondition.health; } }
    Condition hunger { get { return uiCondition.hunger; } }
    Condition stemina { get { return uiCondition.stemina; } }

    public float noHungerHealthDecay;    
    
    void Update()
    {
        hunger.Subtract(hunger.passiveValue * Time.deltaTime);
        stemina.Add(stemina.passiveValue * Time.deltaTime);

        if (hunger.curValue == 0)
        {
            health.Subtract(noHungerHealthDecay * Time.deltaTime);
        }
        if(health.curValue == 0) 
        {
            Die();
        }
    }

    public void Heal(float amount)
    {
        health.Add(amount);
    } 
    public void Eat(float amount)
    {
        hunger.Add(amount);
    }
    public void Die()
    {
        Debug.Log("죽었다");
    }
}

 

📌 아이템설정

CreateEmpty  -> ItemName + 위치 + Rigidbody + Collider + ItemObject Script

아래에 3D Prefab넣어주기


📌 아이템 스크립터블오브젝트

아이템 데이터 : 스크립터블오브젝트 스크립트 작성

public enum ItemType
{ 
    Equipable, //장착가능
    Consumable, //섭취가능
    Resource //단순자원
}

public enum ConsumableType
{ 
    Health,
    Hunger,
    Stemina
}

[Serializable]
public class ItemDataConsumable
{
    public ConsumableType type;
    public float value;
}

[CreateAssetMenu(fileName = "Item",menuName ="New Item")]
public class ItemData : ScriptableObject
{
    [Header("Info")]
    public string displayName;
    public string description;
    public ItemType type;
    public Sprite icon;
    public GameObject dropPrefab;

    [Header("Stacking")]
    public bool canStack;
    public int maxStackAmount;

    [Header("Consumable")]
    public ItemDataConsumable[] consumables;
}

 

스크립터블 오브젝트 생성

 

스크립터블 오브젝트 세팅

 

아이템오브젝트에 아이템오브젝트 스크립트 넣어주고,

Data 드래그 앤 드롭

 

 

Ray ray = camera.ScreenPointToRay(new Vector3(Screen.width / 2, Screen.height / 2));

카메라를 기준으로 레이를 쏨

 

👀 ItemObject Script

public interface IInteractable
{
    public string GetInteractPrompt();
    public void OnInteract();
}

public class ItemObject : MonoBehaviour, IInteractable
{
    public ItemData data;

    public string GetInteractPrompt()
    {
        string str = $"{data.displayName}\n{data.description}";
        return str;
    }

    public void OnInteract()
    {
        CharacterManager.instance.Player.itemData = data;
        CharacterManager.instance.Player.addItem?.Invoke();
        Destroy(gameObject);

    }
}

 

 

🔥 10/29 화요일 목표 🔥 

🔎 개인 프로젝트 필수구현 완료(동적환경조사, 점프대, 아이템 사용)