123 lines
3.1 KiB
C#
123 lines
3.1 KiB
C#
using Obvious.Soap;
|
|
using SoapCustomVariable;
|
|
using UnityEngine;
|
|
|
|
public class MultiplayerFishControllerSpawner : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private ScriptableEventNetworkObjectSpawn OnNetworkObjectSpawn;
|
|
|
|
[SerializeField]
|
|
private GameObjectVariable currentFightFishObject;
|
|
|
|
[SerializeField]
|
|
private ScriptableEventFishData OnFishCollect;
|
|
|
|
[SerializeField]
|
|
private ScriptableEventFishData OnFishThrow;
|
|
|
|
[SerializeField]
|
|
private FSMVariable playerState;
|
|
|
|
[SerializeField]
|
|
private float despawnDelayAfterThrow = 4f;
|
|
|
|
private MultiplayerFishController networkedFishInFight;
|
|
|
|
private void CurrentFightFishObject_OnValueChanged(GameObject fish)
|
|
{
|
|
if ((bool)fish)
|
|
{
|
|
SpawnNetworkedFishInFigh();
|
|
}
|
|
else
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
}
|
|
}
|
|
|
|
private void PlayerState_OnValueChanged(State state)
|
|
{
|
|
if (!IsPlayerStateWithFish(state))
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
}
|
|
}
|
|
|
|
private void MultiplayerManager_OnInSession()
|
|
{
|
|
SpawnNetworkedFishInFigh();
|
|
}
|
|
|
|
private void MultiplayerFishController_OnStartLocal(MultiplayerFishController multiplayerFishController)
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
networkedFishInFight = multiplayerFishController;
|
|
if (currentFightFishObject.Value != null && currentFightFishObject.Value.TryGetComponent<FishController>(out var component))
|
|
{
|
|
networkedFishInFight.Init(component);
|
|
}
|
|
else
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
}
|
|
}
|
|
|
|
private void OnFishThrow_OnRaised(FishData fishData)
|
|
{
|
|
DespawnNetworkedFishInFight(despawnDelayAfterThrow);
|
|
}
|
|
|
|
private void OnFishCollect_OnRaised(FishData fishData)
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
currentFightFishObject.OnValueChanged += CurrentFightFishObject_OnValueChanged;
|
|
playerState.OnValueChanged += PlayerState_OnValueChanged;
|
|
MultiplayerManager.OnInSession += MultiplayerManager_OnInSession;
|
|
MultiplayerFishController.OnStartLocal += MultiplayerFishController_OnStartLocal;
|
|
OnFishCollect.OnRaised += OnFishCollect_OnRaised;
|
|
OnFishThrow.OnRaised += OnFishThrow_OnRaised;
|
|
}
|
|
|
|
private void OnDisable()
|
|
{
|
|
currentFightFishObject.OnValueChanged -= CurrentFightFishObject_OnValueChanged;
|
|
playerState.OnValueChanged -= PlayerState_OnValueChanged;
|
|
MultiplayerManager.OnInSession -= MultiplayerManager_OnInSession;
|
|
MultiplayerFishController.OnStartLocal -= MultiplayerFishController_OnStartLocal;
|
|
OnFishCollect.OnRaised -= OnFishCollect_OnRaised;
|
|
OnFishThrow.OnRaised -= OnFishThrow_OnRaised;
|
|
}
|
|
|
|
private void DespawnNetworkedFishInFight(float delay = 0f)
|
|
{
|
|
if ((bool)networkedFishInFight)
|
|
{
|
|
networkedFishInFight.Deinit(delay);
|
|
networkedFishInFight = null;
|
|
}
|
|
}
|
|
|
|
private void SpawnNetworkedFishInFigh()
|
|
{
|
|
DespawnNetworkedFishInFight();
|
|
if (currentFightFishObject.Value != null)
|
|
{
|
|
OnNetworkObjectSpawn.Raise(new NetworkObjectSpawn("MultiplayerFishController", currentFightFishObject.Value.transform.position, currentFightFishObject.Value.transform.rotation));
|
|
}
|
|
}
|
|
|
|
private bool IsPlayerStateWithFish(State state)
|
|
{
|
|
if (state != State.fight && state != State.fishView && state != State.collectFish)
|
|
{
|
|
return state == State.throwFish;
|
|
}
|
|
return true;
|
|
}
|
|
}
|