자원 생성기 제작 및 맵 생성기에 통합

및 씬 내 오브젝트 구조 정리
This commit is contained in:
2026-02-02 16:14:01 +09:00
parent a0cb8499b0
commit 106fe81c88
5 changed files with 1163 additions and 195 deletions

View File

@@ -19,6 +19,24 @@ namespace Northbound
public float rechargeInterval = 5f; // 충전 주기 (초)
public int rechargeAmount = 10; // 주기당 충전량
[Header("Quality (Runtime)")]
[SerializeField] private NetworkVariable<float> _qualityPercentage = new NetworkVariable<float>(
0f,
NetworkVariableReadPermission.Everyone,
NetworkVariableWritePermission.Server
);
[Tooltip("품질 보정율 (-30% ~ +30%)")]
[SerializeField] private float _displayQuality = 0f;
[Tooltip("품질 적용 후 최대 자원량")]
[SerializeField] private int _displayMaxResources = 100;
[Tooltip("품질 적용 후 충전량")]
[SerializeField] private int _displayRechargeAmount = 10;
private bool _isQualityInitialized = false;
[Header("Animation")]
public string interactionAnimationTrigger = "Mining"; // 플레이어 애니메이션 트리거
@@ -107,13 +125,83 @@ namespace Northbound
private float _lastGatheringTime;
private float _lastRechargeTime;
public float QualityPercentage => _qualityPercentage.Value;
public int ActualMaxResources
{
get
{
float multiplier = 1f + (_qualityPercentage.Value / 100f);
return Mathf.RoundToInt(maxResources * multiplier);
}
}
public int ActualRechargeAmount
{
get
{
float multiplier = 1f + (_qualityPercentage.Value / 100f);
return Mathf.RoundToInt(rechargeAmount * multiplier);
}
}
public override void OnNetworkSpawn()
{
_qualityPercentage.OnValueChanged += OnQualityChanged;
if (IsServer)
{
if (!_isQualityInitialized)
{
_qualityPercentage.Value = Random.Range(-30f, 30f);
}
_currentResources.Value = ActualMaxResources;
_lastRechargeTime = Time.time;
_lastGatheringTime = Time.time - gatheringCooldown;
}
_displayQuality = _qualityPercentage.Value;
UpdateDisplayValues();
}
public void InitializeQuality(float qualityPercentage)
{
if (IsServer)
{
_currentResources.Value = maxResources;
_lastRechargeTime = Time.time;
_lastGatheringTime = Time.time - gatheringCooldown;
_qualityPercentage.Value = qualityPercentage;
_displayQuality = qualityPercentage;
_isQualityInitialized = true;
}
else if (IsClient)
{
_displayQuality = qualityPercentage;
UpdateDisplayValues();
}
}
public override void OnNetworkDespawn()
{
_qualityPercentage.OnValueChanged -= OnQualityChanged;
}
private void OnQualityChanged(float previous, float current)
{
_displayQuality = current;
UpdateDisplayValues();
}
private void UpdateDisplayValues()
{
if (IsClient || IsServer)
{
_displayMaxResources = ActualMaxResources;
_displayRechargeAmount = ActualRechargeAmount;
}
else
{
_displayMaxResources = maxResources;
_displayRechargeAmount = rechargeAmount;
}
}
@@ -125,12 +213,12 @@ namespace Northbound
// 자원 충전 로직
if (Time.time - _lastRechargeTime >= rechargeInterval)
{
if (_currentResources.Value < maxResources)
if (_currentResources.Value < ActualMaxResources)
{
int rechargeAmountToAdd = Mathf.Min(rechargeAmount, maxResources - _currentResources.Value);
int rechargeAmountToAdd = Mathf.Min(ActualRechargeAmount, ActualMaxResources - _currentResources.Value);
_currentResources.Value += rechargeAmountToAdd;
// Debug.Log($"{resourceName} {rechargeAmountToAdd} 충전됨. 현재: {_currentResources.Value}/{maxResources}");
// Debug.Log($"{resourceName} {rechargeAmountToAdd} 충전됨. 현재: {_currentResources.Value}/{ActualMaxResources}");
}
_lastRechargeTime = Time.time;
@@ -266,7 +354,7 @@ namespace Northbound
if (_currentResources.Value <= 0)
return "자원 충전 중...";
return $"[E] {resourceName} 채집 ({_currentResources.Value}/{maxResources})";
return $"[E] {resourceName} 채집 ({_currentResources.Value}/{ActualMaxResources})";
}
public string GetInteractionAnimation()