Remove dependencies on legacy variables in GameManager.Instance

This commit is contained in:
Michal Pikulski
2025-10-07 10:44:26 +02:00
parent c46036dce6
commit f845673eca
9 changed files with 113 additions and 89 deletions

View File

@@ -3,6 +3,7 @@ using UnityEngine;
using Pathfinding;
using UnityEngine.SceneManagement;
using Utils;
using AppleHills.Core.Settings;
/// <summary>
/// Controls the follower character, including following the player, handling pickups, and managing held items.
@@ -20,6 +21,10 @@ public class FollowerController: MonoBehaviour
/// </summary>
public float manualMoveSmooth = 8f;
// Settings reference
private IPlayerFollowerSettings _settings;
private IInteractionSettings _interactionSettings;
private GameObject _playerRef;
private Transform _playerTransform;
private AIPath _playerAIPath;
@@ -80,6 +85,10 @@ public class FollowerController: MonoBehaviour
_animator = GetComponentInChildren<Animator>(); // fallback
_spriteRenderer = GetComponentInChildren<SpriteRenderer>();
}
// Initialize settings references
_settings = GameManager.GetSettingsObject<IPlayerFollowerSettings>();
_interactionSettings = GameManager.GetSettingsObject<IInteractionSettings>();
}
void OnEnable()
@@ -108,7 +117,7 @@ public class FollowerController: MonoBehaviour
}
_timer += Time.deltaTime;
if (_timer >= GameManager.Instance.FollowUpdateInterval)
if (_timer >= _settings.FollowUpdateInterval)
{
_timer = 0f;
UpdateFollowTarget();
@@ -120,24 +129,24 @@ public class FollowerController: MonoBehaviour
Vector2 target2D = new Vector2(_targetPoint.x, _targetPoint.y);
float dist = Vector2.Distance(current2D, target2D);
float minSpeed = _followerMaxSpeed * 0.3f;
float lerpFactor = GameManager.Instance.ManualMoveSmooth * Time.deltaTime;
float lerpFactor = _settings.ManualMoveSmooth * Time.deltaTime;
float targetSpeed = 0f;
if (dist > GameManager.Instance.StopThreshold)
if (dist > _settings.StopThreshold)
{
if (dist > GameManager.Instance.ThresholdFar)
if (dist > _settings.ThresholdFar)
{
targetSpeed = _followerMaxSpeed;
}
else if (dist > GameManager.Instance.ThresholdNear && dist <= GameManager.Instance.ThresholdFar)
else if (dist > _settings.ThresholdNear && dist <= _settings.ThresholdFar)
{
targetSpeed = _followerMaxSpeed;
}
else if (dist > GameManager.Instance.StopThreshold && dist <= GameManager.Instance.ThresholdNear)
else if (dist > _settings.StopThreshold && dist <= _settings.ThresholdNear)
{
targetSpeed = minSpeed;
}
_currentSpeed = Mathf.Lerp(_currentSpeed, targetSpeed, lerpFactor);
if (dist > GameManager.Instance.StopThreshold && dist <= GameManager.Instance.ThresholdNear)
if (dist > _settings.StopThreshold && dist <= _settings.ThresholdNear)
{
_currentSpeed = Mathf.Max(_currentSpeed, minSpeed);
}
@@ -215,7 +224,7 @@ public class FollowerController: MonoBehaviour
{
_playerMaxSpeed = _playerAIPath.maxSpeed;
_defaultFollowerMaxSpeed = _playerMaxSpeed;
_followerMaxSpeed = _playerMaxSpeed * GameManager.Instance.FollowerSpeedMultiplier;
_followerMaxSpeed = _playerMaxSpeed * _settings.FollowerSpeedMultiplier;
}
}
else
@@ -258,8 +267,8 @@ public class FollowerController: MonoBehaviour
{
moveDir = _lastMoveDir;
}
// Use GameSettings for followDistance
_targetPoint = playerPos - moveDir * GameManager.Instance.FollowDistance;
// Use settings for followDistance
_targetPoint = playerPos - moveDir * _settings.FollowDistance;
_targetPoint.z = 0;
if (_aiPath != null)
{
@@ -310,14 +319,14 @@ public class FollowerController: MonoBehaviour
_aiPath.destination = new Vector3(itemPosition.x, itemPosition.y, 0);
}
// Wait until follower reaches item (2D distance)
while (Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(itemPosition.x, itemPosition.y)) > GameManager.Instance.StopThreshold)
while (Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(itemPosition.x, itemPosition.y)) > _settings.StopThreshold)
{
yield return null;
}
OnPickupArrived?.Invoke();
// Wait briefly, then return to player
yield return new WaitForSeconds(0.2f);
yield return new WaitForSeconds(_interactionSettings.FollowerPickupDelay);
if (_aiPath != null && playerTransform != null)
{
_aiPath.maxSpeed = _followerMaxSpeed;
@@ -325,7 +334,7 @@ public class FollowerController: MonoBehaviour
}
_isReturningToPlayer = true;
// Wait until follower returns to player (2D distance)
while (playerTransform != null && Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(playerTransform.position.x, playerTransform.position.y)) > GameManager.Instance.StopThreshold)
while (playerTransform != null && Vector2.Distance(new Vector2(transform.position.x, transform.position.y), new Vector2(playerTransform.position.x, playerTransform.position.y)) > _settings.StopThreshold)
{
yield return null;
}
@@ -375,15 +384,18 @@ public class FollowerController: MonoBehaviour
{
return CombinationResult.NotApplicable;
}
var rule = GameManager.Instance.GetCombinationRule(pickupA.itemData, pickupB.itemData);
// Use the InteractionSettings directly instead of GameManager
CombinationRule matchingRule = _interactionSettings.GetCombinationRule(pickupA.itemData, pickupB.itemData);
Vector3 spawnPos = pickupA.gameObject.transform.position;
if (rule != null && rule.resultPrefab != null)
if (matchingRule != null && matchingRule.resultPrefab != null)
{
newItem = Instantiate(rule.resultPrefab, spawnPos, Quaternion.identity);
newItem = Instantiate(matchingRule.resultPrefab, spawnPos, Quaternion.identity);
PickupItemData itemData = newItem.GetComponent<Pickup>().itemData;
Destroy(pickupA.gameObject);
Destroy(pickupB.gameObject);
TryPickupItem(newItem,itemData);
TryPickupItem(newItem, itemData);
return CombinationResult.Successful;
}