浏览代码

feat: working relay share and countdown sync

Starts the Netcode game, runs into a new netcode package related issue
/main/staging/2021_Upgrade/Async_Refactor
UnityJacob 2 年前
当前提交
c7ba89bc
共有 8 个文件被更改,包括 42 次插入36 次删除
  1. 12
      Assets/Scripts/GameLobby/Game/GameManager.cs
  2. 7
      Assets/Scripts/GameLobby/Game/LocalLobby.cs
  3. 2
      Assets/Scripts/GameLobby/Game/ServerAddress.cs
  4. 5
      Assets/Scripts/GameLobby/Lobby/LobbyConverters.cs
  5. 8
      Assets/Scripts/GameLobby/Lobby/LobbyManager.cs
  6. 11
      Assets/Scripts/GameLobby/NGO/InGameRunner.cs
  7. 16
      Assets/Scripts/GameLobby/NGO/SetupInGame.cs
  8. 17
      Assets/Scripts/GameLobby/NGO/SymbolObject.cs

12
Assets/Scripts/GameLobby/Game/GameManager.cs


SetGameState(state);
}
public void HostSetRelayCode(string code)
{
m_LocalLobby.RelayCode.Value = code;
SendLocalLobbyData();
}
//Only Host needs to listen to this and change state.
void OnPlayersReady(int readyCount)
{

BeginCountDown();
}
public void BeginCountDown()
void BeginCountDown()
SendLocalLobbyData();
public void CancelCountDown()
void CancelCountDown()
{
Debug.Log("Countdown Cancelled.");
m_countdown.CancelCountDown();

7
Assets/Scripts/GameLobby/Game/LocalLobby.cs


public CallbackValue<string> RelayCode = new CallbackValue<string>();
public CallbackValue<string> RelayNGOCode = new CallbackValue<string>();
public CallbackValue<ServerAddress> RelayServer = new CallbackValue<ServerAddress>();
public CallbackValue<string> LobbyName = new CallbackValue<string>();

m_LocalPlayers.Insert(index, user);
user.UserStatus.onChanged += OnUserChangedStatus;
onUserJoined?.Invoke(user);
Debug.Log($"Added User: {user.DisplayName.Value} - {user.ID.Value} to slot {index+1}/{PlayerCount}");
Debug.Log($"Added User: {user.DisplayName.Value} - {user.ID.Value} to slot {index + 1}/{PlayerCount}");
}
public void RemovePlayer(int playerIndex)

sb.AppendLine(LocalLobbyColor.Value.ToString());
sb.Append("RelayCode: ");
sb.AppendLine(RelayCode.Value);
sb.Append("RelayNGO: ");
sb.AppendLine(RelayNGOCode.Value);
return sb.ToString();
}

2
Assets/Scripts/GameLobby/Game/ServerAddress.cs


return m_IP == other.m_IP && m_Port == other.m_Port;
}
#pragma warning disable CS0659
#pragma warning restore CS0659
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;

5
Assets/Scripts/GameLobby/Lobby/LobbyConverters.cs


public static class LobbyConverters
{
const string key_RelayCode = nameof(LocalLobby.RelayCode);
const string key_RelayNGOCode = nameof(LocalLobby.RelayNGOCode);
const string key_LobbyState = nameof(LocalLobby.LocalLobbyState);
const string key_LobbyColor = nameof(LocalLobby.LocalLobbyColor);
const string key_LastEdit = nameof(LocalLobby.LastUpdated);

{
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add(key_RelayCode, lobby.RelayCode.Value);
data.Add(key_RelayNGOCode, lobby.RelayNGOCode.Value);
data.Add(key_LobbyState, ((int)lobby.LocalLobbyState.Value).ToString());
data.Add(key_LobbyColor, ((int)lobby.LocalLobbyColor.Value).ToString());
data.Add(key_LastEdit, lobby.LastUpdated.Value.ToString());

localLobby.RelayCode.Value = remoteLobby.Data?.ContainsKey(key_RelayCode) == true
? remoteLobby.Data[key_RelayCode].Value
: localLobby.RelayCode.Value;
localLobby.RelayNGOCode.Value = remoteLobby.Data?.ContainsKey(key_RelayNGOCode) == true
? remoteLobby.Data[key_RelayNGOCode].Value
: localLobby.RelayNGOCode.Value;
localLobby.LocalLobbyState.Value = remoteLobby.Data?.ContainsKey(key_LobbyState) == true
? (LobbyState)int.Parse(remoteLobby.Data[key_LobbyState].Value)
: LobbyState.Lobby;

8
Assets/Scripts/GameLobby/Lobby/LobbyManager.cs


public class LobbyManager : IDisposable
{
const string key_RelayCode = nameof(LocalLobby.RelayCode);
const string key_RelayNGOCode = nameof(LocalLobby.RelayNGOCode);
const string key_LobbyState = nameof(LocalLobby.LocalLobbyState);
const string key_LobbyColor = nameof(LocalLobby.LocalLobbyColor);

if (changedKey == key_RelayCode)
localLobby.RelayCode.Value = playerDataObject.Value;
if (changedKey == key_RelayNGOCode)
localLobby.RelayNGOCode.Value = playerDataObject.Value;
if (changedKey == key_LobbyState)
localLobby.LocalLobbyState.Value = (LobbyState)int.Parse(playerDataObject.Value);

{
if (changedKey == key_RelayCode)
localLobby.RelayCode.Value = "";
if (changedKey == key_RelayNGOCode)
localLobby.RelayNGOCode.Value = "";
}
}

var lastUpdated = playerChanges.LastUpdatedChanged.Value;
Debug.Log($"LastUpdated for {localPlayer.DisplayName.Value} changed to {lastUpdated}");
}
//There are changes on the Player
if (playerChanges.ChangedData.Changed)
{

11
Assets/Scripts/GameLobby/NGO/InGameRunner.cs


private void FinishInitialize()
{
m_symbolContainerInstance = NetworkObject.Instantiate(m_symbolContainerPrefab).transform;
m_symbolContainerInstance = Instantiate(m_symbolContainerPrefab).transform;
m_symbolContainerInstance.GetComponent<NetworkObject>().Spawn();
ResetPendingSymbolPositions();
m_killVolume.Initialize(OnSymbolDeactivated);

[ServerRpc(RequireOwnership = false)]
private void VerifyConnectionConfirm_ServerRpc(PlayerData clientData)
{
NetworkObject playerCursor = NetworkObject.Instantiate(m_playerCursorPrefab); // Note that the client will not receive the cursor object reference, so the cursor must handle initializing itself.
NetworkObject playerCursor = Instantiate(m_playerCursorPrefab); // Note that the client will not receive the cursor object reference, so the cursor must handle initializing itself.
playerCursor.SpawnWithOwnership(clientData.id);
playerCursor.name += clientData.name;
m_dataStore.AddPlayer(clientData.id, clientData.name);

public void Update()
{
CheckIfCanSpawnNewSymbol();
if(IsServer||IsHost)
CheckIfCanSpawnNewSymbol();
if (m_timeout >= 0)
{
m_timeout -= Time.deltaTime;

var symbolObj = Instantiate(m_symbolObjectPrefab, m_symbolContainerInstance);
symbolObj.NetworkObject.Spawn();
symbolObj.name = "Symbol" + index;
symbolObj.NetworkObject.TrySetParent(m_symbolContainerInstance, false);
// NetworkObject.TrySetParent(m_symbolContainerInstance, false);
symbolObj.GetComponent<SymbolObject>().symbolIndex.Value = m_sequenceSelector.GetNextSymbol(index);
symbolObj.symbolIndex.Value = m_sequenceSelector.GetNextSymbol(index);
m_remainingSymbolCount++;
}
}

16
Assets/Scripts/GameLobby/NGO/SetupInGame.cs


}
else
{
await AwaitRelayCode(localLobby);
async Task AwaitRelayCode(LocalLobby lobby)
{
string relayCode = lobby.RelayCode.Value;
lobby.RelayCode.onChanged += (code) => relayCode = code;
while (string.IsNullOrEmpty(relayCode))
{
await Task.Delay(100);
}
}
async Task SetRelayHostData()
{
UnityTransport transport = NetworkManager.Singleton.GetComponentInChildren<UnityTransport>();

m_lobby.RelayNGOCode.Value = joincode;
GameManager.Instance.HostSetRelayCode(joincode);
bool isSecure = false;
var endpoint = GetEndpointForAllocation(allocation.ServerEndpoints,

Destroy(m_inGameRunner
.gameObject); // Since this destroys the NetworkManager, that will kick off cleaning up networked objects.
SetMenuVisibility(true);
m_lobby.RelayNGOCode = null;
m_lobby.RelayCode.Value = "";
m_doesNeedCleanup = false;
}
}

17
Assets/Scripts/GameLobby/NGO/SymbolObject.cs


/// </summary>
public class SymbolObject : NetworkBehaviour
{
[SerializeField] SymbolData m_symbolData;
[SerializeField] SpriteRenderer m_renderer;
[SerializeField] private Animator m_animator;
[SerializeField]
SymbolData m_symbolData;
[SerializeField]
SpriteRenderer m_renderer;
[SerializeField]
private Animator m_animator;
[HideInInspector] public NetworkVariable<int> symbolIndex; // The index into SymbolData, not the index of this object.
[HideInInspector]
public NetworkVariable<int> symbolIndex; // The index into SymbolData, not the index of this object.
public override void OnNetworkSpawn()
{

public void SetPosition_Server(Vector3 newPosition)
{
SetPosition_ClientRpc(newPosition);
}

transform.localPosition = newPosition;
}
[ServerRpc]
public void ClickedSequence_ServerRpc(ulong clickerPlayerId)

yield return new WaitForSeconds(0.3f);
HideSymbol_ServerRpc();
}
}
}
正在加载...
取消
保存