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 화요일 목표 🔥
🔎 개인 프로젝트 필수구현 완료(동적환경조사, 점프대, 아이템 사용)