Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
using System.Reflection;
using Game.MVP.Survivor.Services;
using Game.Shared.Signals.Survivor;
using MessagePipe;
using NUnit.Framework;
using R3;

Expand All @@ -13,36 +12,28 @@ namespace Game.Tests.MVP
public class SurvivorWaveManagerTests
{
private SurvivorStageWaveManager _manager;
private TestPublisher<SurvivorSignals.Wave.Completed> _waveCompletedPublisher;
private List<SurvivorSignals.Wave.Completed> _waveCompletedEvents;
private List<Unit> _killCountedEvents;
private IDisposable _killCountedSubscription;

/// <summary>テスト用 IPublisher 実装</summary>
private class TestPublisher<T> : IPublisher<T>
{
public List<T> Published { get; } = new();
public void Publish(T message) { Published.Add(message); }
}
private IDisposable _waveCompletedSubscription;

[SetUp]
public void Setup()
{
_manager = new SurvivorStageWaveManager();
_killCountedEvents = new List<Unit>();
_waveCompletedEvents = new List<SurvivorSignals.Wave.Completed>();

// Wave.Completed のテスト用 Publisher を注入
_waveCompletedPublisher = new TestPublisher<SurvivorSignals.Wave.Completed>();
var pubField = typeof(SurvivorStageWaveManager).GetField("_waveCompletedPublisher", BindingFlags.NonPublic | BindingFlags.Instance);
pubField?.SetValue(_manager, _waveCompletedPublisher);

// イベント購読
// ローカル Observable を購読
_killCountedSubscription = _manager.OnKillCounted.Subscribe(unit => _killCountedEvents.Add(unit));
_waveCompletedSubscription = _manager.OnWaveCompleted.Subscribe(e => _waveCompletedEvents.Add(e));
}

[TearDown]
public void TearDown()
{
_killCountedSubscription?.Dispose();
_waveCompletedSubscription?.Dispose();
_manager?.Dispose();
}

Expand Down Expand Up @@ -199,7 +190,7 @@ public void OnEnemyKilled_WhenTargetAndBossReached_TriggersWaveClear()
_manager.OnEnemyKilled(isBoss: true);

// Assert
Assert.That(_waveCompletedPublisher.Published.Count, Is.EqualTo(1));
Assert.That(_waveCompletedEvents.Count, Is.EqualTo(1));
}

[Test]
Expand All @@ -212,7 +203,7 @@ public void OnEnemyKilled_WhenTargetReachedButBossNotReached_DoesNotTriggerWaveC
_manager.OnEnemyKilled(isBoss: false); // Regular kill reaches target

// Assert - Wave not cleared because boss requirement not met
Assert.That(_waveCompletedPublisher.Published.Count, Is.EqualTo(0));
Assert.That(_waveCompletedEvents.Count, Is.EqualTo(0));
}

[Test]
Expand All @@ -225,7 +216,7 @@ public void OnEnemyKilled_WhenBossReachedButTargetNotReached_DoesNotTriggerWaveC
_manager.OnEnemyKilled(isBoss: true); // Boss kill but target not reached

// Assert
Assert.That(_waveCompletedPublisher.Published.Count, Is.EqualTo(0));
Assert.That(_waveCompletedEvents.Count, Is.EqualTo(0));
}

[Test]
Expand All @@ -239,7 +230,7 @@ public void OnEnemyKilled_WithZeroBossRequirement_ClearsOnTargetReached()
_manager.OnEnemyKilled(isBoss: false);

// Assert
Assert.That(_waveCompletedPublisher.Published.Count, Is.EqualTo(1));
Assert.That(_waveCompletedEvents.Count, Is.EqualTo(1));
}

#endregion
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public partial class SurvivorEnemyController : MonoBehaviour, ICombatTarget, IDe
private int _currentHp;
private Transform _target;
private bool _isDead;
private int _networkId = -1;

// Events
private readonly Subject<SurvivorEnemyController> _onDeath = new();
Expand All @@ -63,6 +64,9 @@ public partial class SurvivorEnemyController : MonoBehaviour, ICombatTarget, IDe
public int ExperienceValue => _experienceValue;
public bool IsDead => _isDead;

/// <summary>ネットワーク同期用ID(SurvivorEnemySpawnerが設定)</summary>
public int NetworkId => _networkId;

/// <summary>現在HP(ネットワーク同期用)</summary>
public int CurrentHp => _currentHp;

Expand Down Expand Up @@ -177,6 +181,8 @@ public void TakeDamage(int damage)
}
}

public void SetNetworkId(int id) => _networkId = id;

public void ApplyKnockback(Vector3 knockback)
{
if (_isDead || _navAgent == null || !_navAgent.enabled) return;
Expand All @@ -192,6 +198,7 @@ public void ResetForPool()
{
_isDead = false;
_currentHp = _maxHp;
_networkId = -1;
_hasPendingDamage = false;
_pendingDamageAmount = 0;
_target = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,6 @@ public class SurvivorEnemySpawner : MonoBehaviour
private float _spawnTimer;
private int _remainingSpawnCount;

private bool _isClient;

// ネットワーク敵同期
private ISurvivorNetworkBridge _networkBridge;
private const float EnemySyncInterval = 0.1f; // 10Hz
Expand Down Expand Up @@ -136,7 +134,6 @@ public void SetNetworkBridge(ISurvivorNetworkBridge bridge)
public async UniTask InitializeAsync(SurvivorStageWaveManager waveManager)
{
_waveManager = waveManager;
_isClient = NetworkModeHelper.IsNetworkClient;

// レイヤーマスクが未設定の場合、Structureレイヤーを使用
if (_obstacleLayerMask == 0)
Expand Down Expand Up @@ -175,7 +172,7 @@ public async UniTask InitializeAsync(SurvivorStageWaveManager waveManager)
}

// MP Client: 敵はサーバーバッチ同期で表示、ローカルスポーン不要
if (!_isClient)
if (!NetworkModeHelper.IsNetworkClient)
{
_waveManager.CurrentWave
.Where(wave => wave > 0)
Expand Down Expand Up @@ -240,7 +237,7 @@ private void Update()
}

// MP Client: ローカルスポーン無効
if (_isClient) return;
if (NetworkModeHelper.IsNetworkClient) return;

if (!_isSpawning)
{
Expand Down Expand Up @@ -375,6 +372,7 @@ private void SpawnNextEnemy()
var networkId = _nextNetworkId++;
_enemyNetworkIds[enemy] = networkId;
_enemyByNetworkId[networkId] = enemy;
enemy.SetNetworkId(networkId);
_activeEnemies.Add(enemy);
_remainingSpawnCount--;
_spawnTimer = spawnInfo.SpawnInterval;
Expand Down Expand Up @@ -579,7 +577,7 @@ private void OnEnemyDeath(SurvivorEnemyController enemy)
.AddTo(this);

// ウェーブサービスに通知(ボスかどうかも伝える)
if (!_isClient)
if (!NetworkModeHelper.IsNetworkClient)
{
_waveManager.OnEnemyKilled(enemy.IsBoss);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using System;
using Game.Shared.Item;
using Game.Shared.Network;
using Game.Shared.Playmode;
using UnityEngine;

namespace Game.MVP.Survivor.Item
Expand Down Expand Up @@ -98,7 +96,6 @@ private void ApplyTransform()

private void Start()
{
if (UnityPlaymodeHelper.IsServer()) return;
_initialPosition = transform.position;
_baseFloatAmplitude = _floatAmplitude * _scale;
}
Expand All @@ -122,9 +119,6 @@ private void Update()

private void UpdateFloatAnimation()
{
if (UnityPlaymodeHelper.IsServer())
return;

_floatTimer += Time.deltaTime * _floatSpeed;
float yOffset = Mathf.Sin(_floatTimer) * _baseFloatAmplitude;
transform.position = _initialPosition + Vector3.up * yOffset;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ public void SpawnItem(int itemId, Vector3 position)
_activeItems[itemId].Add(item);

// サーバー: クライアントにアイテムスポーンを通知
_networkBridge?.NotifyItemSpawned(itemId, position.x, position.z);
_networkBridge?.NotifyItemSpawned(itemId, position.x, position.y, position.z);
}
}

Expand Down
Loading
Loading