This commit is contained in:
Brett Kercher 2020-06-24 12:42:40 -05:00
Родитель 5c72eb5ade
Коммит f0a952fd07
26 изменённых файлов: 604 добавлений и 169 удалений

Просмотреть файл

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: a4c98355d3b704ef99f71b957061b12b guid: 573df92b82ee77c448f181821d617c60
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

Просмотреть файл

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: c743ae24ee231884887054d20ccdd0ab guid: ae15a6df40454a446bd8a73356a71a51
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

Просмотреть файл

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 68c7e4565cde54155bb78d8e935f1ddb guid: 429a6edf064b6534ba4940f6ff4c1526
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

Просмотреть файл

@ -1,12 +1,15 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 863e1b9976c4e46d29bf83928b3a8ab2 guid: a3f0f0e72b185664aab3424af9461349
PluginImporter: PluginImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2
iconMap: {} iconMap: {}
executionOrder: {} executionOrder: {}
defineConstraints: []
isPreloaded: 0 isPreloaded: 0
isOverridable: 0 isOverridable: 0
isExplicitlyReferenced: 0
validateReferences: 1
platformData: platformData:
- first: - first:
Any: Any:

Просмотреть файл

@ -1,9 +0,0 @@
fileFormatVersion: 2
guid: 99b48d4d4f6a66340ab06bd487d70a45
folderAsset: yes
timeCreated: 1493304320
licenseType: Store
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -54,7 +54,7 @@ LightmapSettings:
m_EnableBakedLightmaps: 0 m_EnableBakedLightmaps: 0
m_EnableRealtimeLightmaps: 0 m_EnableRealtimeLightmaps: 0
m_LightmapEditorSettings: m_LightmapEditorSettings:
serializedVersion: 10 serializedVersion: 12
m_Resolution: 2 m_Resolution: 2
m_BakeResolution: 40 m_BakeResolution: 40
m_AtlasSize: 1024 m_AtlasSize: 1024
@ -62,6 +62,7 @@ LightmapSettings:
m_AOMaxDistance: 1 m_AOMaxDistance: 1
m_CompAOExponent: 1 m_CompAOExponent: 1
m_CompAOExponentDirect: 0 m_CompAOExponentDirect: 0
m_ExtractAmbientOcclusion: 0
m_Padding: 2 m_Padding: 2
m_LightmapParameters: {fileID: 0} m_LightmapParameters: {fileID: 0}
m_LightmapsBakeMode: 1 m_LightmapsBakeMode: 1
@ -76,10 +77,16 @@ LightmapSettings:
m_PVRDirectSampleCount: 32 m_PVRDirectSampleCount: 32
m_PVRSampleCount: 500 m_PVRSampleCount: 500
m_PVRBounces: 2 m_PVRBounces: 2
m_PVREnvironmentSampleCount: 500
m_PVREnvironmentReferencePointCount: 2048
m_PVRFilteringMode: 2
m_PVRDenoiserTypeDirect: 0
m_PVRDenoiserTypeIndirect: 0
m_PVRDenoiserTypeAO: 0
m_PVRFilterTypeDirect: 0 m_PVRFilterTypeDirect: 0
m_PVRFilterTypeIndirect: 0 m_PVRFilterTypeIndirect: 0
m_PVRFilterTypeAO: 0 m_PVRFilterTypeAO: 0
m_PVRFilteringMode: 1 m_PVREnvironmentMIS: 0
m_PVRCulling: 1 m_PVRCulling: 1
m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusDirect: 1
m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusIndirect: 5
@ -87,7 +94,9 @@ LightmapSettings:
m_PVRFilteringAtrousPositionSigmaDirect: 0.5 m_PVRFilteringAtrousPositionSigmaDirect: 0.5
m_PVRFilteringAtrousPositionSigmaIndirect: 2 m_PVRFilteringAtrousPositionSigmaIndirect: 2
m_PVRFilteringAtrousPositionSigmaAO: 1 m_PVRFilteringAtrousPositionSigmaAO: 1
m_ShowResolutionOverlay: 1 m_ExportTrainingData: 0
m_TrainingDataDestination: TrainingData
m_LightProbeSampleCountMultiplier: 4
m_LightingDataAsset: {fileID: 0} m_LightingDataAsset: {fileID: 0}
m_UseShadowmask: 1 m_UseShadowmask: 1
--- !u!196 &4 --- !u!196 &4
@ -150,9 +159,10 @@ Camera:
m_ClearFlags: 1 m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0}
m_projectionMatrixMode: 1 m_projectionMatrixMode: 1
m_GateFitMode: 2
m_FOVAxisMode: 0
m_SensorSize: {x: 36, y: 24} m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0} m_LensShift: {x: 0, y: 0}
m_GateFitMode: 2
m_FocalLength: 50 m_FocalLength: 50
m_NormalizedViewPortRect: m_NormalizedViewPortRect:
serializedVersion: 2 serializedVersion: 2
@ -204,6 +214,8 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 2104027225} - component: {fileID: 2104027225}
- component: {fileID: 2104027224} - component: {fileID: 2104027224}
- component: {fileID: 2104027226}
- component: {fileID: 2104027227}
m_Layer: 0 m_Layer: 0
m_Name: GameManager m_Name: GameManager
m_TagString: Untagged m_TagString: Untagged
@ -223,11 +235,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 08c5abc1c8bd9d7428048b5bc932bc87, type: 3} m_Script: {fileID: 11500000, guid: 08c5abc1c8bd9d7428048b5bc932bc87, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
_users: email: bleh@blah.com
- email: hello@world.com
password: password
- email: goodbye@world.com
password: password
--- !u!4 &2104027225 --- !u!4 &2104027225
Transform: Transform:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -242,3 +250,29 @@ Transform:
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 1 m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &2104027226
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2104027223}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7408efdfffadbb84b9f5def253d85577, type: 3}
m_Name:
m_EditorClassIdentifier:
_shipPrefab: {fileID: 8291833512214639835, guid: 584333c77fccb9944a3793d4e4cb7c65,
type: 3}
--- !u!114 &2104027227
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2104027223}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 819a13b084a12774eb665e3ff85ee4f6, type: 3}
m_Name:
m_EditorClassIdentifier:

Просмотреть файл

@ -309,6 +309,51 @@ PrefabInstance:
m_RemovedComponents: m_RemovedComponents:
- {fileID: 8579451657641387260, guid: f6820ab1e68494ee6ab947b3f14bcd57, type: 3} - {fileID: 8579451657641387260, guid: f6820ab1e68494ee6ab947b3f14bcd57, type: 3}
m_SourcePrefab: {fileID: 100100000, guid: f6820ab1e68494ee6ab947b3f14bcd57, type: 3} m_SourcePrefab: {fileID: 100100000, guid: f6820ab1e68494ee6ab947b3f14bcd57, type: 3}
--- !u!1 &1491314831
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1491314833}
- component: {fileID: 1491314832}
m_Layer: 0
m_Name: GameManager
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1491314832
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1491314831}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7408efdfffadbb84b9f5def253d85577, type: 3}
m_Name:
m_EditorClassIdentifier:
_shipPrefab: {fileID: 8291833512214639835, guid: 584333c77fccb9944a3793d4e4cb7c65,
type: 3}
--- !u!4 &1491314833
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1491314831}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: -10}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1001 &1501938911 --- !u!1001 &1501938911
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

Просмотреть файл

@ -10,50 +10,22 @@ using UnityEngine.SceneManagement;
namespace FootRoids namespace FootRoids
{ {
[Serializable]
public struct FakeUser
{
public string email;
public string password;
}
public class FakeMatchmaker : MonoBehaviour public class FakeMatchmaker : MonoBehaviour
{ {
[SerializeField] FakeUser[] m_Users = null;
readonly IClient m_Client = new Client("http", "207.254.17.33", 7350, "defaultkey");
List<ISocket> m_Sockets = new List<ISocket>();
IMatch m_Match; IMatch m_Match;
[SerializeField] private string m_email = "one@one.com";
async void Start() async void Start() {
{ var client = ServerSessionManager.Instance.Client;
foreach (var user in m_Users) ServerSessionManager.Instance.Session = await client.AuthenticateEmailAsync(m_email, "password");
{
ServerSessionManager.Instance.Session = await m_Client.AuthenticateEmailAsync(user.email, user.password);
ServerSessionManager.Instance.Socket = m_Client.NewSocket();
ServerSessionManager.Instance.Socket.Connected += () => { Debug.Log("Socket Connected!"); };
ServerSessionManager.Instance.Socket.Closed += () => { Debug.Log("Socket Closed!"); };
ServerSessionManager.Instance.Socket.ReceivedChannelMessage += (message) => { Debug.Log("Message Received: " + message); };
ServerSessionManager.Instance.Socket.ReceivedMatchmakerMatched += MatchmakerMatched; ServerSessionManager.Instance.Socket.ReceivedMatchmakerMatched += MatchmakerMatched;
ServerSessionManager.Instance.Socket.ReceivedMatchState += async (state) =>
{
Debug.Log("Received Message From Server: " + state.State);
};
await ServerSessionManager.Instance.Socket.ConnectAsync(ServerSessionManager.Instance.Session); await ServerSessionManager.Instance.Socket.ConnectAsync(ServerSessionManager.Instance.Session);
await ServerSessionManager.Instance.Socket.AddMatchmakerAsync("*", 2, 2); await ServerSessionManager.Instance.Socket.AddMatchmakerAsync("*", 2, 2);
m_Sockets.Add(ServerSessionManager.Instance.Socket);
}
} }
void MatchmakerMatched(IMatchmakerMatched matched) void MatchmakerMatched(IMatchmakerMatched matched)
{ {
Debug.Log("Matched!");
UnityMainThreadDispatcher.Instance().Enqueue(() => UnityMainThreadDispatcher.Instance().Enqueue(() =>
{ {
ISocket socket = ServerSessionManager.Instance.Socket; ISocket socket = ServerSessionManager.Instance.Socket;
@ -76,28 +48,17 @@ namespace FootRoids
MatchCommunicationManager.Instance.JoinMatchAsync(matched); MatchCommunicationManager.Instance.JoinMatchAsync(matched);
} }
void OnApplicationQuit() private IEnumerator LoadGame(IMatchmakerMatched matched)
{ {
foreach (var socket in m_Sockets) AsyncOperation asyncLoad = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync("MatchScene", UnityEngine.SceneManagement.LoadSceneMode.Additive);
while (!asyncLoad.isDone)
{ {
socket?.CloseAsync(); yield return null;
}
} }
void FixedUpdate() UnityEngine.SceneManagement.SceneManager.UnloadSceneAsync("FakeMatchmaker");
{ MatchCommunicationManager.Instance.JoinMatchAsync(matched);
if (Input.GetKeyDown(KeyCode.P))
{
if (m_Match == null)
{
Debug.Log("Match is null");
}
Debug.Log("Sending Message To Server!");
var socket = m_Sockets[0];
var newState = new Dictionary<string, string> {{"hello", "world"}}.ToJson();
socket.SendMatchStateAsync(m_Match.Id, 1, newState);
}
} }
} }
} }

Просмотреть файл

@ -20,7 +20,6 @@ namespace Multiplayer
public string CurrentHostId { private set; get; } public string CurrentHostId { private set; get; }
public string MatchId { private set; get; } public string MatchId { private set; get; }
public bool IsHost public bool IsHost
{ {
get get
@ -38,7 +37,6 @@ namespace Multiplayer
private ISocket _socket { get { return ServerSessionManager.Instance.Socket; } } private ISocket _socket { get { return ServerSessionManager.Instance.Socket; } }
private bool allPlayersAdded; private bool allPlayersAdded;
private bool matchJoined;
private bool isLeaving; private bool isLeaving;
private Queue<IncommingMessageState> inboundMessages = new Queue<IncommingMessageState>(); private Queue<IncommingMessageState> inboundMessages = new Queue<IncommingMessageState>();
@ -53,7 +51,7 @@ namespace Multiplayer
{ {
return; return;
} }
if(allPlayersAdded == false || matchJoined == false) if(allPlayersAdded == false)
{ {
return; return;
} }
@ -79,27 +77,27 @@ namespace Multiplayer
public async void JoinMatchAsync(IMatchmakerMatched matched) public async void JoinMatchAsync(IMatchmakerMatched matched)
{ {
ChooseHost(matched); ChooseHost(matched);
Players = new List<IUserPresence>(); Players = new List<IUserPresence>();
try try
{ {
// Listen to incomming match messages and user connection changes // Listen to incoming match messages and user connection changes
_socket.ReceivedMatchPresence += OnMatchPresence; _socket.ReceivedMatchPresence += OnMatchPresence;
_socket.ReceivedMatchState += ReceiveMatchStateMessage; _socket.ReceivedMatchState += ReceiveMatchStateMessage;
// Join the match // Join the match
IMatch match = await _socket.JoinMatchAsync(matched); var match = await _socket.JoinMatchAsync(matched);
// Set current match id // Set current match id
// It will be used to leave the match later // It will be used to leave the match later
MatchId = match.Id; MatchId = match.Id;
Debug.Log("Joined match with id: " + match.Id + "; presences count: " + match.Presences.Count()); Debug.Log("Joined match with id: " + match.Id + "; presences count: " + match.Presences.Count());
foreach (var user in match.Presences) {
Debug.Log("User: " + user.Username);
}
AddConnectedPlayers(match);
bool playersJoin = AddConnectedPlayers(match); if(allPlayersAdded)
if(playersJoin)
{ {
matchJoined = true;
StartGame(); StartGame();
} }
} }
@ -122,6 +120,9 @@ namespace Multiplayer
//{ //{
// OpponentId = user.UserId; // OpponentId = user.UserId;
//} //}
Debug.Log("Player Count: " + Players.Count);
if (AllPlayersJoined == true) if (AllPlayersJoined == true)
{ {
allPlayersAdded = true; allPlayersAdded = true;
@ -161,7 +162,6 @@ namespace Multiplayer
default: default:
Debug.Log("Needs more implementation!"); Debug.Log("Needs more implementation!");
break; break;
} }
} }
@ -185,32 +185,21 @@ namespace Multiplayer
CurrentHostId = hostUser.Presence.UserId; CurrentHostId = hostUser.Presence.UserId;
} }
private bool AddConnectedPlayers(IMatch match) private void AddConnectedPlayers(IMatch match)
{ {
foreach(IUserPresence user in match.Presences) foreach(IUserPresence user in match.Presences)
{ {
if(Players.FindIndex(x => x.UserId == user.UserId) == -1) if(Players.FindIndex(x => x.UserId == user.UserId) == -1)
{ {
Debug.Log("User +" + user.Username + " joined match"); Debug.Log("User +" + user.Username + " joined match");
Players.Add(user); Players.Add(user);
}
// TODO: need to set opponent id? }
if(AllPlayersJoined)
if(AllPlayersJoined == true)
{ {
allPlayersAdded = true; allPlayersAdded = true;
} }
} }
else
{
Debug.LogError("Not allowed!");
return false;
}
}
return true;
}
} }
} }

Просмотреть файл

@ -0,0 +1,42 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Multiplayer;
using Nakama;
using UnityEngine;
public class GameManager : MonoBehaviour {
[SerializeField] private GameObject _shipPrefab;
private Dictionary<string, GameObject> _networkedGameObjects = new Dictionary<string, GameObject>();
private void Awake() {
MatchCommunicationManager.Instance.OnGameStarted += InitializeGame;
MatchCommunicationManager.Instance.OnGameEnded += EndGame;
}
private void InitializeGame() {
MatchCommunicationManager.Instance.OnGameStarted -= InitializeGame;
var players = MatchCommunicationManager.Instance.Players;
foreach (var player in players) {
CreateShip(player);
}
}
private void EndGame(MatchMessageGameEnded message) {
MatchCommunicationManager.Instance.OnGameEnded -= EndGame;
}
public void CreateShip(IUserPresence owner) {
Debug.Log("Creating Ship for User: " + owner.Username);
var shipGO = Instantiate(_shipPrefab);
var network = shipGO.GetComponent<NetworkedObject>();
network.owner = owner;
_networkedGameObjects.Add(owner.UserId, shipGO);
}
public GameObject GetObjectWithNetworkId(string id) {
return _networkedGameObjects[id];
}
}

Просмотреть файл

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7408efdfffadbb84b9f5def253d85577
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,109 @@
/*
Copyright 2015 Pim de Witte All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Threading.Tasks;
/// Author: Pim de Witte (pimdewitte.com) and contributors, https://github.com/PimDeWitte/UnityMainThreadDispatcher
/// <summary>
/// A thread-safe class which holds a queue with actions to execute on the next Update() method. It can be used to make calls to the main thread for
/// things such as UI Manipulation in Unity. It was developed for use in combination with the Firebase Unity plugin, which uses separate threads for event handling
/// </summary>
public class MainThreadDispatcher : MonoBehaviour {
private static readonly Queue<Action> _executionQueue = new Queue<Action>();
public void Update() {
lock (_executionQueue) {
while (_executionQueue.Count > 0) {
_executionQueue.Dequeue().Invoke();
}
}
}
/// <summary>
/// Locks the queue and adds the IEnumerator to the queue
/// </summary>
/// <param name="action">IEnumerator function that will be executed from the main thread.</param>
public void Enqueue(IEnumerator action) {
lock (_executionQueue) {
_executionQueue.Enqueue(() => { StartCoroutine(action); });
}
}
/// <summary>
/// Locks the queue and adds the Action to the queue
/// </summary>
/// <param name="action">function that will be executed from the main thread.</param>
public void Enqueue(Action action) {
Enqueue(ActionWrapper(action));
}
/// <summary>
/// Locks the queue and adds the Action to the queue, returning a Task which is completed when the action completes
/// </summary>
/// <param name="action">function that will be executed from the main thread.</param>
/// <returns>A Task that can be awaited until the action completes</returns>
public Task EnqueueAsync(Action action) {
var tcs = new TaskCompletionSource<bool>();
void WrappedAction() {
try {
action();
tcs.TrySetResult(true);
}
catch (Exception ex) {
tcs.TrySetException(ex);
}
}
Enqueue(ActionWrapper(WrappedAction));
return tcs.Task;
}
IEnumerator ActionWrapper(Action a) {
a();
yield return null;
}
private static MainThreadDispatcher _instance = null;
public static bool Exists() {
return _instance != null;
}
public static MainThreadDispatcher Instance() {
if (!Exists()) {
throw new Exception(
"UnityMainThreadDispatcher could not find the UnityMainThreadDispatcher object. Please ensure you have added the MainThreadExecutor Prefab to your scene.");
}
return _instance;
}
void Awake() {
if (_instance == null) {
_instance = this;
DontDestroyOnLoad(this.gameObject);
}
}
void OnDestroy() {
_instance = null;
}
}

Просмотреть файл

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 819a13b084a12774eb665e3ff85ee4f6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -1,5 +1,5 @@
fileFormatVersion: 2 fileFormatVersion: 2
guid: 08c5abc1c8bd9d7428048b5bc932bc87 guid: 7c8fd2fecbc0f6d46ac1a19a797b077c
MonoImporter: MonoImporter:
externalObjects: {} externalObjects: {}
serializedVersion: 2 serializedVersion: 2

Просмотреть файл

@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Nakama;
using Nakama.TinyJson;
using UnityEngine;
public class NetworkManager : MonoBehaviour {
[SerializeField] private string email;
private readonly IClient _client = new Client("http", "127.0.0.1", 7350, "defaultkey");
private ISocket _socket;
private IMatch _match;
private GameManager _gameManager;
private IUserPresence _self;
private void Awake() {
_gameManager = GetComponent<GameManager>();
}
private async void Start() {
var session = await _client.AuthenticateEmailAsync(email, "password");
var socket = _client.NewSocket();
socket.Connected += () => {
Debug.Log("Socket Connected!");
};
socket.Closed += () => {
Debug.Log("Socket Closed!");
};
socket.ReceivedChannelMessage += (message) => {
Debug.Log("Message Received: " + message);
};
socket.ReceivedMatchmakerMatched += async (matched) => {
var match = await socket.JoinMatchAsync(matched);
};
socket.ReceivedMatchState += (state) => {
Debug.Log("Received Message From Server: " + state.State);
};
socket.ReceivedMatchPresence += (presence) => {
foreach (var user in presence.Joins) {
OnPlayerJoined(user);
}
foreach (var user in presence.Leaves) {
OnPlayerLeft(user);
}
};
await socket.ConnectAsync(session);
await socket.AddMatchmakerAsync("*", 2, 2);
_socket= socket;
}
private void OnApplicationQuit() {
_socket?.CloseAsync();
}
private void OnMatchJoined(IMatch match) {
_self = match.Self;
var participants = match.Presences.ToArray();
foreach (var player in participants) {
// MainThreadDispatcher.Instance().Enqueue(_gameManager.CreateShip(player));
}
}
private void OnPlayerJoined(IUserPresence player) {
// MainThreadDispatcher.Instance().Enqueue(_gameManager.CreateShip(player));
}
private void OnPlayerLeft(IUserPresence player) {
//TODO Destroy player's ship object
Debug.Log("Player Left: " + player.Username);
}
private void FixedUpdate() {
// if (Input.GetKeyDown(KeyCode.P) ) {
// if (_match == null) {
// Debug.Log("Match is null");
// }
// Debug.Log("Sending Message To Server!");
// var socket = _sockets[0];
// var newState = new Dictionary<string, string> {{"hello", "world"}}.ToJson();
// socket.SendMatchStateAsync(_match.Id, 1, newState);
// }
}
}

Просмотреть файл

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 08c5abc1c8bd9d7428048b5bc932bc87
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,8 @@
using System.Collections;
using System.Collections.Generic;
using Nakama;
using UnityEngine;
public class NetworkedObject : MonoBehaviour {
public IUserPresence owner;
}

Просмотреть файл

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 119103344b8d0ff4092f30feb92c4fd5
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,135 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &8291833512214639835
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 8291833512214639829}
- component: {fileID: 8291833512214639828}
- component: {fileID: 8291833512214639830}
- component: {fileID: 8291833512214639831}
- component: {fileID: -2807015394847699250}
m_Layer: 0
m_Name: Ship
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &8291833512214639829
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8291833512214639835}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!212 &8291833512214639828
SpriteRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8291833512214639835}
m_Enabled: 1
m_CastShadows: 0
m_ReceiveShadows: 0
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 0
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_Sprite: {fileID: 21300000, guid: 0c3df53fe2e934f03a4920b155092b87, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
m_Size: {x: 0.99, y: 0.75}
m_AdaptiveModeThreshold: 0.5
m_SpriteTileMode: 0
m_WasSpriteAssigned: 1
m_MaskInteraction: 0
m_SpriteSortPoint: 0
--- !u!50 &8291833512214639830
Rigidbody2D:
serializedVersion: 4
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8291833512214639835}
m_BodyType: 0
m_Simulated: 1
m_UseFullKinematicContacts: 0
m_UseAutoMass: 0
m_Mass: 1
m_LinearDrag: 0
m_AngularDrag: 0.05
m_GravityScale: 0
m_Material: {fileID: 0}
m_Interpolate: 0
m_SleepingMode: 1
m_CollisionDetection: 0
m_Constraints: 0
--- !u!114 &8291833512214639831
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8291833512214639835}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 49a70b167dac0c442a59992aad208874, type: 3}
m_Name:
m_EditorClassIdentifier:
_speed: 3
_rotationSpeed: 3
_rigidbody: {fileID: 0}
--- !u!114 &-2807015394847699250
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8291833512214639835}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 119103344b8d0ff4092f30feb92c4fd5, type: 3}
m_Name:
m_EditorClassIdentifier:
owned: 0

Просмотреть файл

@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 584333c77fccb9944a3793d4e4cb7c65
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -0,0 +1,24 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SimpleMove : MonoBehaviour {
[SerializeField] private float _speed = 3f;
[SerializeField] private float _rotationSpeed = 3f;
[SerializeField] private Rigidbody2D _rigidbody;
// Start is called before the first frame update
void Awake() {
_rigidbody = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update() {
var vInput = Input.GetAxis("Vertical") * _speed;
var hInput = Input.GetAxis("Horizontal") * _rotationSpeed;
_rigidbody.AddForce(new Vector2(0, vInput));
_rigidbody.AddTorque(-hInput);
}
}

Просмотреть файл

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 49a70b167dac0c442a59992aad208874
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

Просмотреть файл

@ -3,7 +3,7 @@
--- !u!30 &1 --- !u!30 &1
GraphicsSettings: GraphicsSettings:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
serializedVersion: 12 serializedVersion: 13
m_Deferred: m_Deferred:
m_Mode: 1 m_Mode: 1
m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
@ -32,6 +32,9 @@ GraphicsSettings:
- {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 16000, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 16001, guid: 0000000000000000f000000000000000, type: 0}
- {fileID: 17000, guid: 0000000000000000f000000000000000, type: 0}
m_PreloadedShaders: [] m_PreloadedShaders: []
m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000,
type: 0} type: 0}
@ -56,3 +59,5 @@ GraphicsSettings:
m_AlbedoSwatchInfos: [] m_AlbedoSwatchInfos: []
m_LightsUseLinearIntensity: 0 m_LightsUseLinearIntensity: 0
m_LightsUseColorTemperature: 0 m_LightsUseColorTemperature: 0
m_LogWhenShaderIsCompiled: 0
m_AllowEnlightenSupportForUpgradedProject: 1

Просмотреть файл

@ -91,7 +91,7 @@ PlayerSettings:
xboxEnableFitness: 0 xboxEnableFitness: 0
visibleInBackground: 1 visibleInBackground: 1
allowFullscreenSwitch: 1 allowFullscreenSwitch: 1
fullscreenMode: 1 fullscreenMode: 3
xboxSpeechDB: 0 xboxSpeechDB: 0
xboxEnableHeadOrientation: 0 xboxEnableHeadOrientation: 0
xboxEnableGuest: 0 xboxEnableGuest: 0

Просмотреть файл

@ -1,41 +0,0 @@
local nk = require("nakama")
local M = {}
function M.match_init(context, setupstate)
local gamestate = {}
local tickrate = 1
local label = ""
return gamestate, tickrate, label
end
function M.match_join_attempt(context, dispatcher, tick, state, presence, metadata)
local acceptuser = true
return state, acceptuser
end
function M.match_join(context, dispatcher, tick, state, presences)
return state
end
function M.match_leave(context, dispatcher, tick, state, presences)
return state
end
function M.match_loop(context, dispatcher, tick, state, messages)
for _, message in ipairs(messages) do
print(("Received %s from %s"):format(message.data, message.sender.username))
local decoded = nk.json_decode(message.data)
for k, v in pairs(decoded) do
print(("Message key %s contains value %s"):format(k, v))
end
-- PONG message back to sender
dispatcher.broadcast_message(1, message.data, {message.sender})
end
return state
end
function M.match_terminate(context, dispatcher, tick, state, grace_seconds)
return state
end
return M

Просмотреть файл

@ -1,19 +0,0 @@
local nk = require("nakama")
local function makematch(context, matched_users)
-- print matched users
for _, user in ipairs(matched_users) do
local presence = user.presence
nk.logger_info(("Matched user '%s' named '%s'"):format(presence.user_id, presence.username))
for k, v in pairs(user.properties) do
nk.logger_info(("Matched on '%s' value '%s'"):format(k, v))
end
end
local modulename = "hello_world"
local setupstate = { invited = matched_users }
local matchid = nk.match_create(modulename, setupstate)
return matchid
end
nk.register_matchmaker_matched(makematch)