Compare commits
32 Commits
find-the-s
...
d80ac111c2
| Author | SHA1 | Date | |
|---|---|---|---|
| d80ac111c2 | |||
| 4fdfdea5cf | |||
| 32c7589ab3 | |||
| 44155796d0 | |||
| 5b166244b2 | |||
| 114a0d3997 | |||
| ce6e4450e6 | |||
| 95f2f63259 | |||
| dc5ed7d49f | |||
|
|
2fadf819cc | ||
| ff9a2cebd3 | |||
| e14a3ddf2b | |||
| 5bd6eabec6 | |||
| f2ebd125f3 | |||
| 2fdfabe2b8 | |||
| 4b8e4c69f5 | |||
| e086bedb19 | |||
| 13300e885b | |||
| a73f75ffa4 | |||
| a04ce40779 | |||
| 94a40e3d14 | |||
| eeaf092780 | |||
| fc22d4f544 | |||
| 3b36d53b39 | |||
| b1fc3ac24a | |||
| 655d378dbb | |||
| 39b42e1e90 | |||
| 0cb7d4b64d | |||
| 1c103a1496 | |||
| 1618ecd432 | |||
| ed6347e6bc | |||
| 59b6708437 |
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"permissions": {
|
||||
"allow": [
|
||||
"Bash(nul)",
|
||||
"Bash(mkdir:*)",
|
||||
"Bash(dir:*)",
|
||||
"Bash(findstr:*)",
|
||||
"Bash(move \"Assets\\Scripts\\TiltUI.cs\" \"Assets\\Scripts\\TiltUI.cs.DISABLED\")"
|
||||
],
|
||||
"deny": [],
|
||||
"ask": []
|
||||
}
|
||||
}
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -303,7 +303,6 @@ PublishScripts/
|
||||
*.nupkg
|
||||
# NuGet Symbol Packages
|
||||
*.snupkg
|
||||
# The packages folder can be ignored because of Package Restore
|
||||
# except build/, which is used as an MSBuild target.
|
||||
!**/[Pp]ackages/build/
|
||||
# Uncomment if necessary however generally it will be regenerated when needed
|
||||
@@ -499,5 +498,3 @@ FodyWeavers.xsd
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/unity,visualstudiocode,visualstudio,vim
|
||||
|
||||
|
||||
.utmp/
|
||||
|
||||
6
.vsconfig
Normal file
6
.vsconfig
Normal file
@@ -0,0 +1,6 @@
|
||||
{
|
||||
"version": "1.0",
|
||||
"components": [
|
||||
"Microsoft.VisualStudio.Workload.ManagedGame"
|
||||
]
|
||||
}
|
||||
285
Assets/ClientSDK/Encryption.cs
Normal file
285
Assets/ClientSDK/Encryption.cs
Normal file
@@ -0,0 +1,285 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
|
||||
namespace GeoSus.Client
|
||||
{
|
||||
// Klientská strana šifrování - generuje session key, šifruje RSA, AES-CBC session
|
||||
// Používá AES-CBC místo AES-GCM pro kompatibilitu s Unity
|
||||
public class ClientEncryption : IDisposable
|
||||
{
|
||||
private byte[] _sessionKey;
|
||||
private byte[] _sessionIv;
|
||||
private long _nonceCounter;
|
||||
private readonly object _lock = new object();
|
||||
|
||||
// Kontrola, zda je session key nastaven
|
||||
public bool HasSessionKey => _sessionKey != null && _sessionIv != null;
|
||||
|
||||
// Generuje nový session key a IV
|
||||
public void GenerateSessionKey()
|
||||
{
|
||||
_sessionKey = new byte[32]; // AES-256
|
||||
_sessionIv = new byte[16]; // CBC IV (16 bytes)
|
||||
|
||||
using (var rng = RandomNumberGenerator.Create())
|
||||
{
|
||||
rng.GetBytes(_sessionKey);
|
||||
rng.GetBytes(_sessionIv);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] SessionKey => _sessionKey ?? throw new InvalidOperationException("Session key not generated");
|
||||
public byte[] SessionIV => _sessionIv ?? throw new InvalidOperationException("Session IV not generated");
|
||||
|
||||
// Zašifruje session key pomocí RSA public key serveru
|
||||
public (string EncryptedKey, string EncryptedIV) EncryptSessionKeyForServer(string rsaPublicKeyPem)
|
||||
{
|
||||
if (_sessionKey == null || _sessionIv == null)
|
||||
throw new InvalidOperationException("Session key not generated");
|
||||
|
||||
using (var rsa = RSA.Create())
|
||||
{
|
||||
// Parse PEM - extrahuj Base64 obsah
|
||||
var pemLines = rsaPublicKeyPem.Split('\n');
|
||||
var base64 = new StringBuilder();
|
||||
foreach (var line in pemLines)
|
||||
{
|
||||
var trimmed = line.Trim();
|
||||
if (!trimmed.StartsWith("-----") && !string.IsNullOrEmpty(trimmed))
|
||||
{
|
||||
base64.Append(trimmed);
|
||||
}
|
||||
}
|
||||
|
||||
var keyBytes = Convert.FromBase64String(base64.ToString());
|
||||
|
||||
// Unity kompatibilní import - parsujeme SubjectPublicKeyInfo ručně
|
||||
ImportSubjectPublicKeyInfoManual(rsa, keyBytes);
|
||||
|
||||
// Používáme OaepSHA1 pro Unity kompatibilitu (OaepSHA256 není podporován)
|
||||
var encryptedKey = rsa.Encrypt(_sessionKey, RSAEncryptionPadding.OaepSHA1);
|
||||
var encryptedIv = rsa.Encrypt(_sessionIv, RSAEncryptionPadding.OaepSHA1);
|
||||
|
||||
return (Convert.ToBase64String(encryptedKey), Convert.ToBase64String(encryptedIv));
|
||||
}
|
||||
}
|
||||
|
||||
// Ručně parsuje SubjectPublicKeyInfo (DER) a importuje RSA klíč - Unity kompatibilní
|
||||
private static void ImportSubjectPublicKeyInfoManual(RSA rsa, byte[] subjectPublicKeyInfo)
|
||||
{
|
||||
// SubjectPublicKeyInfo ::= SEQUENCE {
|
||||
// algorithm AlgorithmIdentifier,
|
||||
// subjectPublicKey BIT STRING }
|
||||
// RSAPublicKey ::= SEQUENCE { modulus INTEGER, publicExponent INTEGER }
|
||||
|
||||
int index = 0;
|
||||
|
||||
// Outer SEQUENCE
|
||||
if (subjectPublicKeyInfo[index++] != 0x30)
|
||||
throw new InvalidOperationException("Invalid SubjectPublicKeyInfo");
|
||||
ReadLength(subjectPublicKeyInfo, ref index);
|
||||
|
||||
// AlgorithmIdentifier SEQUENCE - skip it
|
||||
if (subjectPublicKeyInfo[index++] != 0x30)
|
||||
throw new InvalidOperationException("Invalid AlgorithmIdentifier");
|
||||
int algLen = ReadLength(subjectPublicKeyInfo, ref index);
|
||||
index += algLen;
|
||||
|
||||
// BIT STRING containing RSAPublicKey
|
||||
if (subjectPublicKeyInfo[index++] != 0x03)
|
||||
throw new InvalidOperationException("Invalid BIT STRING");
|
||||
ReadLength(subjectPublicKeyInfo, ref index);
|
||||
index++; // Skip unused bits byte (should be 0)
|
||||
|
||||
// RSAPublicKey SEQUENCE
|
||||
if (subjectPublicKeyInfo[index++] != 0x30)
|
||||
throw new InvalidOperationException("Invalid RSAPublicKey");
|
||||
ReadLength(subjectPublicKeyInfo, ref index);
|
||||
|
||||
// Modulus INTEGER
|
||||
byte[] modulus = ReadInteger(subjectPublicKeyInfo, ref index);
|
||||
|
||||
// Exponent INTEGER
|
||||
byte[] exponent = ReadInteger(subjectPublicKeyInfo, ref index);
|
||||
|
||||
var parameters = new RSAParameters
|
||||
{
|
||||
Modulus = modulus,
|
||||
Exponent = exponent
|
||||
};
|
||||
rsa.ImportParameters(parameters);
|
||||
}
|
||||
|
||||
private static int ReadLength(byte[] data, ref int index)
|
||||
{
|
||||
int length = data[index++];
|
||||
if ((length & 0x80) != 0)
|
||||
{
|
||||
int numBytes = length & 0x7F;
|
||||
length = 0;
|
||||
for (int i = 0; i < numBytes; i++)
|
||||
{
|
||||
length = (length << 8) | data[index++];
|
||||
}
|
||||
}
|
||||
return length;
|
||||
}
|
||||
|
||||
private static byte[] ReadInteger(byte[] data, ref int index)
|
||||
{
|
||||
if (data[index++] != 0x02)
|
||||
throw new InvalidOperationException("Expected INTEGER");
|
||||
int length = ReadLength(data, ref index);
|
||||
|
||||
// Skip leading zero if present (used for positive sign in DER)
|
||||
int originalLength = length;
|
||||
int start = index;
|
||||
if (length > 1 && data[start] == 0x00)
|
||||
{
|
||||
start++;
|
||||
length--;
|
||||
}
|
||||
|
||||
byte[] result = new byte[length];
|
||||
Buffer.BlockCopy(data, start, result, 0, length);
|
||||
index += originalLength;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// Šifruje zprávu pomocí AES-256-CBC s HMAC
|
||||
public byte[] Encrypt(byte[] plaintext)
|
||||
{
|
||||
if (_sessionKey == null || _sessionIv == null)
|
||||
throw new InvalidOperationException("Session key not set");
|
||||
|
||||
lock (_lock)
|
||||
{
|
||||
// Generuj unikátní IV pro tuto zprávu
|
||||
var iv = GetNextIV();
|
||||
|
||||
using (var aes = Aes.Create())
|
||||
{
|
||||
aes.Key = _sessionKey;
|
||||
aes.IV = iv;
|
||||
aes.Mode = CipherMode.CBC;
|
||||
aes.Padding = PaddingMode.PKCS7;
|
||||
|
||||
byte[] ciphertext;
|
||||
using (var encryptor = aes.CreateEncryptor())
|
||||
using (var ms = new MemoryStream())
|
||||
{
|
||||
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
|
||||
{
|
||||
cs.Write(plaintext, 0, plaintext.Length);
|
||||
}
|
||||
ciphertext = ms.ToArray();
|
||||
}
|
||||
|
||||
// Compute HMAC pro integritu
|
||||
byte[] hmac;
|
||||
using (var hmacSha = new HMACSHA256(_sessionKey))
|
||||
{
|
||||
var toSign = new byte[iv.Length + ciphertext.Length];
|
||||
Buffer.BlockCopy(iv, 0, toSign, 0, iv.Length);
|
||||
Buffer.BlockCopy(ciphertext, 0, toSign, iv.Length, ciphertext.Length);
|
||||
hmac = hmacSha.ComputeHash(toSign);
|
||||
}
|
||||
|
||||
// Výstup: [16 bytes IV][32 bytes HMAC][ciphertext]
|
||||
var result = new byte[16 + 32 + ciphertext.Length];
|
||||
Buffer.BlockCopy(iv, 0, result, 0, 16);
|
||||
Buffer.BlockCopy(hmac, 0, result, 16, 32);
|
||||
Buffer.BlockCopy(ciphertext, 0, result, 48, ciphertext.Length);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dešifruje zprávu pomocí AES-256-CBC s HMAC ověřením
|
||||
public byte[] Decrypt(byte[] encrypted)
|
||||
{
|
||||
if (_sessionKey == null)
|
||||
throw new InvalidOperationException("Session key not set");
|
||||
|
||||
if (encrypted.Length < 48) return null;
|
||||
|
||||
try
|
||||
{
|
||||
var iv = new byte[16];
|
||||
var hmac = new byte[32];
|
||||
var ciphertext = new byte[encrypted.Length - 48];
|
||||
|
||||
Buffer.BlockCopy(encrypted, 0, iv, 0, 16);
|
||||
Buffer.BlockCopy(encrypted, 16, hmac, 0, 32);
|
||||
Buffer.BlockCopy(encrypted, 48, ciphertext, 0, ciphertext.Length);
|
||||
|
||||
// Ověř HMAC
|
||||
byte[] expectedHmac;
|
||||
using (var hmacSha = new HMACSHA256(_sessionKey))
|
||||
{
|
||||
var toVerify = new byte[iv.Length + ciphertext.Length];
|
||||
Buffer.BlockCopy(iv, 0, toVerify, 0, iv.Length);
|
||||
Buffer.BlockCopy(ciphertext, 0, toVerify, iv.Length, ciphertext.Length);
|
||||
expectedHmac = hmacSha.ComputeHash(toVerify);
|
||||
}
|
||||
|
||||
// Constant-time compare
|
||||
var diff = 0;
|
||||
for (int i = 0; i < 32; i++)
|
||||
{
|
||||
diff |= hmac[i] ^ expectedHmac[i];
|
||||
}
|
||||
if (diff != 0) return null; // HMAC mismatch
|
||||
|
||||
using (var aes = Aes.Create())
|
||||
{
|
||||
aes.Key = _sessionKey;
|
||||
aes.IV = iv;
|
||||
aes.Mode = CipherMode.CBC;
|
||||
aes.Padding = PaddingMode.PKCS7;
|
||||
|
||||
using (var decryptor = aes.CreateDecryptor())
|
||||
using (var ms = new MemoryStream(ciphertext))
|
||||
using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read))
|
||||
using (var output = new MemoryStream())
|
||||
{
|
||||
cs.CopyTo(output);
|
||||
return output.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (CryptographicException)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private byte[] GetNextIV()
|
||||
{
|
||||
if (_sessionIv == null)
|
||||
throw new InvalidOperationException("Session IV not set");
|
||||
|
||||
var iv = new byte[16];
|
||||
Buffer.BlockCopy(_sessionIv, 0, iv, 0, 8);
|
||||
|
||||
var counter = System.Threading.Interlocked.Increment(ref _nonceCounter);
|
||||
var counterBytes = BitConverter.GetBytes(counter);
|
||||
Buffer.BlockCopy(counterBytes, 0, iv, 8, 8);
|
||||
|
||||
return iv;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_sessionKey != null)
|
||||
{
|
||||
Array.Clear(_sessionKey, 0, _sessionKey.Length);
|
||||
_sessionKey = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
73
Assets/ClientSDK/EventDispatcher.cs
Normal file
73
Assets/ClientSDK/EventDispatcher.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
|
||||
namespace GeoSus.Client
|
||||
{
|
||||
// Event dispatcher pro Unity main thread
|
||||
// Unity může přidat SynchronizationContext, nebo polling z Update()
|
||||
public class EventDispatcher
|
||||
{
|
||||
private readonly Queue<Action> _pendingActions = new Queue<Action>();
|
||||
private readonly object _lock = new object();
|
||||
private SynchronizationContext? _syncContext;
|
||||
|
||||
public EventDispatcher()
|
||||
{
|
||||
// Pokusíme se zachytit aktuální synchronization context (Unity main thread)
|
||||
_syncContext = SynchronizationContext.Current;
|
||||
}
|
||||
|
||||
// Volat z networking vlákna - naplánuje callback na main thread
|
||||
public void Post(Action action)
|
||||
{
|
||||
if (_syncContext != null)
|
||||
{
|
||||
_syncContext.Post(_ => action(), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Fallback - přidáme do fronty pro polling
|
||||
lock (_lock)
|
||||
{
|
||||
_pendingActions.Enqueue(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Volat z Unity Update() pokud není SynchronizationContext
|
||||
public void ProcessPendingActions()
|
||||
{
|
||||
Action[] actions;
|
||||
lock (_lock)
|
||||
{
|
||||
if (_pendingActions.Count == 0) return;
|
||||
actions = _pendingActions.ToArray();
|
||||
_pendingActions.Clear();
|
||||
}
|
||||
|
||||
foreach (var action in actions)
|
||||
{
|
||||
try
|
||||
{
|
||||
action();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"EventDispatcher error: {ex}");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public int PendingCount
|
||||
{
|
||||
get
|
||||
{
|
||||
lock (_lock)
|
||||
{
|
||||
return _pendingActions.Count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
607
Assets/ClientSDK/GameClient.cs
Normal file
607
Assets/ClientSDK/GameClient.cs
Normal file
@@ -0,0 +1,607 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GeoSus.Client
|
||||
{
|
||||
// Hlavní klientská třída pro připojení k serveru
|
||||
public class GameClient : IDisposable
|
||||
{
|
||||
private TcpClient? _tcpClient;
|
||||
private NetworkStream? _stream;
|
||||
private ClientEncryption? _encryption;
|
||||
private CancellationTokenSource? _cts;
|
||||
private Task? _receiveTask;
|
||||
private int _clientSeq;
|
||||
private readonly object _sendLock = new object();
|
||||
private bool _handshakeComplete;
|
||||
|
||||
public string ClientUuid { get; }
|
||||
public string DisplayName { get; set; }
|
||||
public bool IsConnected => _tcpClient?.Connected ?? false;
|
||||
public bool IsReady => IsConnected && _handshakeComplete && (_encryption?.HasSessionKey ?? false);
|
||||
public EventDispatcher Dispatcher { get; }
|
||||
|
||||
// Events - voláno na main thread přes dispatcher
|
||||
public event Action? OnConnected;
|
||||
public event Action<string>? OnDisconnected;
|
||||
public event Action<string>? OnError;
|
||||
public event Action<Message>? OnMessage;
|
||||
public event Action<GameEvent>? OnGameEvent;
|
||||
|
||||
// Lobby state
|
||||
public string? LobbyId { get; private set; }
|
||||
public string? JoinCode { get; private set; }
|
||||
public LobbyState? CurrentLobbyState { get; private set; }
|
||||
public PlayerRole? MyRole { get; private set; }
|
||||
public List<GameTask> MyTasks { get; } = new List<GameTask>();
|
||||
public Position MyPosition { get; set; }
|
||||
public Dictionary<string, PlayerPositionInfo> PlayerPositions { get; } = new Dictionary<string, PlayerPositionInfo>();
|
||||
public List<Body> Bodies { get; } = new List<Body>();
|
||||
public int Ping { get; private set; }
|
||||
public long LastEventId { get; private set; }
|
||||
|
||||
/// <summary>Returns true if this client is the current lobby owner</summary>
|
||||
public bool IsOwner => CurrentLobbyState?.OwnerId == ClientUuid;
|
||||
|
||||
public GameClient(string clientUuid, string displayName)
|
||||
{
|
||||
ClientUuid = clientUuid;
|
||||
DisplayName = displayName;
|
||||
Dispatcher = new EventDispatcher();
|
||||
}
|
||||
|
||||
#region Connection
|
||||
|
||||
public async Task<bool> ConnectAsync(string host, int port)
|
||||
{
|
||||
try
|
||||
{
|
||||
_tcpClient = new TcpClient();
|
||||
await _tcpClient.ConnectAsync(host, port);
|
||||
_stream = _tcpClient.GetStream();
|
||||
_encryption = new ClientEncryption();
|
||||
_cts = new CancellationTokenSource();
|
||||
|
||||
// Handshake
|
||||
if (!await PerformHandshakeAsync())
|
||||
{
|
||||
Disconnect("Handshake failed");
|
||||
return false;
|
||||
}
|
||||
|
||||
// Spustíme příjem zpráv
|
||||
_receiveTask = Task.Run(() => ReceiveLoopAsync(_cts.Token));
|
||||
|
||||
Dispatcher.Post(() => OnConnected?.Invoke());
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Dispatcher.Post(() => OnError?.Invoke(ex.Message));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<bool> PerformHandshakeAsync()
|
||||
{
|
||||
if (_stream == null || _encryption == null) return false;
|
||||
|
||||
// 1. ClientHello
|
||||
var hello = new ClientHello
|
||||
{
|
||||
ClientUuid = ClientUuid,
|
||||
DisplayName = DisplayName
|
||||
};
|
||||
await SendPlainAsync(hello);
|
||||
|
||||
// 2. ServerHello
|
||||
var serverHelloData = await ReadMessageAsync();
|
||||
if (serverHelloData == null) return false;
|
||||
|
||||
var serverHello = MessageSerializer.Deserialize(serverHelloData) as ServerHello;
|
||||
if (serverHello == null) return false;
|
||||
|
||||
// 3. Generujeme session key a šifrujeme RSA
|
||||
_encryption.GenerateSessionKey();
|
||||
var (encKey, encIv) = _encryption.EncryptSessionKeyForServer(serverHello.RsaPublicKeyPem);
|
||||
|
||||
var keyExchange = new KeyExchange
|
||||
{
|
||||
EncryptedSessionKey = encKey,
|
||||
EncryptedIV = encIv
|
||||
};
|
||||
await SendPlainAsync(keyExchange);
|
||||
|
||||
// 4. KeyExchangeAck (šifrovaně)
|
||||
var ackData = await ReadMessageAsync();
|
||||
if (ackData == null) return false;
|
||||
|
||||
var decrypted = _encryption.Decrypt(ackData);
|
||||
if (decrypted == null) return false;
|
||||
|
||||
var ack = MessageSerializer.Deserialize(decrypted) as KeyExchangeAck;
|
||||
if (ack?.Status == "success")
|
||||
{
|
||||
_handshakeComplete = true;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public void Disconnect(string reason = "User disconnected")
|
||||
{
|
||||
_cts?.Cancel();
|
||||
_tcpClient?.Close();
|
||||
_tcpClient = null;
|
||||
_stream = null;
|
||||
_encryption?.Dispose();
|
||||
_encryption = null;
|
||||
|
||||
LobbyId = null;
|
||||
JoinCode = null;
|
||||
CurrentLobbyState = null;
|
||||
MyRole = null;
|
||||
MyTasks.Clear();
|
||||
PlayerPositions.Clear();
|
||||
Bodies.Clear();
|
||||
|
||||
Dispatcher.Post(() => OnDisconnected?.Invoke(reason));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Sending
|
||||
|
||||
public void Send(Message message)
|
||||
{
|
||||
if (_stream == null || _encryption == null || !IsConnected) return;
|
||||
|
||||
message.ClientSeq = Interlocked.Increment(ref _clientSeq);
|
||||
if (string.IsNullOrEmpty(message.ActionId))
|
||||
{
|
||||
message.ActionId = Guid.NewGuid().ToString("N").Substring(0, 8);
|
||||
}
|
||||
|
||||
var plain = MessageSerializer.Serialize(message);
|
||||
var encrypted = _encryption.Encrypt(plain);
|
||||
|
||||
lock (_sendLock)
|
||||
{
|
||||
try
|
||||
{
|
||||
SendData(encrypted);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Dispatcher.Post(() => OnError?.Invoke($"Send error: {ex.Message}"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SendPlainAsync(Message message)
|
||||
{
|
||||
if (_stream == null) return;
|
||||
var data = MessageSerializer.Serialize(message);
|
||||
await SendDataAsync(data);
|
||||
}
|
||||
|
||||
private void SendData(byte[] data)
|
||||
{
|
||||
if (_stream == null) return;
|
||||
|
||||
var lengthBuffer = BitConverter.GetBytes(data.Length);
|
||||
if (BitConverter.IsLittleEndian)
|
||||
Array.Reverse(lengthBuffer);
|
||||
|
||||
_stream.Write(lengthBuffer, 0, 4);
|
||||
_stream.Write(data, 0, data.Length);
|
||||
_stream.Flush();
|
||||
}
|
||||
|
||||
private async Task SendDataAsync(byte[] data)
|
||||
{
|
||||
if (_stream == null) return;
|
||||
|
||||
var lengthBuffer = BitConverter.GetBytes(data.Length);
|
||||
if (BitConverter.IsLittleEndian)
|
||||
Array.Reverse(lengthBuffer);
|
||||
|
||||
await _stream.WriteAsync(lengthBuffer, 0, 4);
|
||||
await _stream.WriteAsync(data, 0, data.Length);
|
||||
await _stream.FlushAsync();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Receiving
|
||||
|
||||
private async Task ReceiveLoopAsync(CancellationToken ct)
|
||||
{
|
||||
int decryptFailures = 0;
|
||||
|
||||
try
|
||||
{
|
||||
while (!ct.IsCancellationRequested && IsConnected)
|
||||
{
|
||||
var data = await ReadMessageAsync();
|
||||
if (data == null) break;
|
||||
|
||||
var decrypted = _encryption?.Decrypt(data);
|
||||
if (decrypted == null)
|
||||
{
|
||||
decryptFailures++;
|
||||
if (decryptFailures >= 3)
|
||||
{
|
||||
Disconnect("Too many decryption failures");
|
||||
return;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
decryptFailures = 0;
|
||||
|
||||
var message = MessageSerializer.Deserialize(decrypted);
|
||||
if (message != null)
|
||||
{
|
||||
ProcessMessage(message);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex) when (!ct.IsCancellationRequested)
|
||||
{
|
||||
Disconnect($"Connection error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<byte[]?> ReadMessageAsync()
|
||||
{
|
||||
if (_stream == null) return null;
|
||||
|
||||
var lengthBuffer = new byte[4];
|
||||
var read = await _stream.ReadAsync(lengthBuffer, 0, 4);
|
||||
if (read < 4) return null;
|
||||
|
||||
if (BitConverter.IsLittleEndian)
|
||||
Array.Reverse(lengthBuffer);
|
||||
var length = BitConverter.ToInt32(lengthBuffer, 0);
|
||||
|
||||
if (length <= 0 || length > 1048576) return null;
|
||||
|
||||
var buffer = new byte[length];
|
||||
var totalRead = 0;
|
||||
while (totalRead < length)
|
||||
{
|
||||
read = await _stream.ReadAsync(buffer, totalRead, length - totalRead);
|
||||
if (read == 0) return null;
|
||||
totalRead += read;
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
private void ProcessMessage(Message message)
|
||||
{
|
||||
// Zpracujeme speciální typy
|
||||
switch (message)
|
||||
{
|
||||
case CreateLobbyResponse r:
|
||||
if (r.Success)
|
||||
{
|
||||
LobbyId = r.LobbyId;
|
||||
JoinCode = r.JoinCode;
|
||||
CurrentLobbyState = r.LobbyState;
|
||||
}
|
||||
break;
|
||||
|
||||
case JoinLobbyResponse r:
|
||||
if (r.Success)
|
||||
{
|
||||
LobbyId = r.LobbyId;
|
||||
CurrentLobbyState = r.LobbyState;
|
||||
JoinCode = r.LobbyState?.JoinCode;
|
||||
}
|
||||
break;
|
||||
|
||||
case PositionBroadcast b:
|
||||
ProcessPositionBroadcast(b);
|
||||
break;
|
||||
|
||||
case Pong p:
|
||||
var now = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
|
||||
Ping = (int)(now - p.ClientTime);
|
||||
break;
|
||||
|
||||
case GameEvent evt:
|
||||
ProcessGameEvent(evt);
|
||||
Dispatcher.Post(() => OnGameEvent?.Invoke(evt));
|
||||
break;
|
||||
}
|
||||
|
||||
Dispatcher.Post(() => OnMessage?.Invoke(message));
|
||||
}
|
||||
|
||||
private void ProcessPositionBroadcast(PositionBroadcast broadcast)
|
||||
{
|
||||
PlayerPositions.Clear();
|
||||
foreach (var player in broadcast.Players)
|
||||
{
|
||||
PlayerPositions[player.ClientUuid] = player;
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessGameEvent(GameEvent evt)
|
||||
{
|
||||
LastEventId = evt.EventId;
|
||||
|
||||
switch (evt.EventType)
|
||||
{
|
||||
case "PlayerJoined":
|
||||
// Add player to lobby state
|
||||
var joinedPayload = evt.GetPayload<PlayerJoinedPayload>();
|
||||
if (joinedPayload != null && CurrentLobbyState?.Players != null)
|
||||
{
|
||||
// Check if player already exists
|
||||
bool exists = CurrentLobbyState.Players.Any(p => p.ClientUuid == joinedPayload.ClientUuid);
|
||||
if (!exists)
|
||||
{
|
||||
CurrentLobbyState.Players.Add(new PlayerInfo
|
||||
{
|
||||
ClientUuid = joinedPayload.ClientUuid,
|
||||
DisplayName = joinedPayload.DisplayName,
|
||||
IsOwner = false,
|
||||
IsReady = false,
|
||||
State = PlayerState.Alive
|
||||
});
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "PlayerLeft":
|
||||
// Remove player from lobby state
|
||||
var leftPayload = evt.GetPayload<PlayerLeftPayload>();
|
||||
if (leftPayload != null && CurrentLobbyState?.Players != null)
|
||||
{
|
||||
CurrentLobbyState.Players.RemoveAll(p => p.ClientUuid == leftPayload.ClientUuid);
|
||||
}
|
||||
break;
|
||||
|
||||
case "HostChanged":
|
||||
// Update lobby owner
|
||||
var hostPayload = evt.GetPayload<HostChangedPayload>();
|
||||
if (hostPayload != null && CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.OwnerId = hostPayload.NewHostId;
|
||||
// Update IsOwner flag on all players
|
||||
foreach (var player in CurrentLobbyState.Players)
|
||||
{
|
||||
player.IsOwner = player.ClientUuid == hostPayload.NewHostId;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "GameStarting":
|
||||
// Game is entering loading phase - update lobby state if available
|
||||
if (CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.Phase = GamePhase.Loading;
|
||||
}
|
||||
break;
|
||||
|
||||
case "MapDataReady":
|
||||
// Map data received - store it and send confirmation
|
||||
var mapDataPayload = evt.GetPayload<MapDataReadyPayload>();
|
||||
if (mapDataPayload != null && CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.MapData = mapDataPayload.MapData;
|
||||
CurrentLobbyState.MapDataReady = true;
|
||||
}
|
||||
// Send confirmation to server
|
||||
Send(new MapDataReceived());
|
||||
break;
|
||||
|
||||
case "GameStarted":
|
||||
// Game officially started - update phase
|
||||
if (CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.Phase = GamePhase.Playing;
|
||||
}
|
||||
break;
|
||||
|
||||
case "RoleAssigned":
|
||||
var rolePayload = evt.GetPayload<RoleAssignedPayload>();
|
||||
if (rolePayload != null && rolePayload.ClientUuid == ClientUuid)
|
||||
{
|
||||
MyRole = rolePayload.Role;
|
||||
MyTasks.Clear();
|
||||
if (rolePayload.Tasks != null)
|
||||
{
|
||||
MyTasks.AddRange(rolePayload.Tasks);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "PlayerKilled":
|
||||
var killPayload = evt.GetPayload<PlayerKilledPayload>();
|
||||
if (killPayload != null)
|
||||
{
|
||||
Bodies.Add(new Body
|
||||
{
|
||||
BodyId = killPayload.BodyId,
|
||||
VictimId = killPayload.VictimId,
|
||||
Location = killPayload.Location
|
||||
});
|
||||
}
|
||||
break;
|
||||
|
||||
case "MeetingStarted":
|
||||
if (CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.Phase = GamePhase.Meeting;
|
||||
}
|
||||
break;
|
||||
|
||||
case "VotingClosed":
|
||||
Bodies.Clear(); // Bodies zmizí po meetingu
|
||||
if (CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.Phase = GamePhase.Playing;
|
||||
}
|
||||
break;
|
||||
|
||||
case "GameEnded":
|
||||
if (CurrentLobbyState != null)
|
||||
{
|
||||
CurrentLobbyState.Phase = GamePhase.Ended;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Game Actions
|
||||
|
||||
public void CreateLobby(Position? center = null, int impostorCount = 1, int taskCount = 5, string? password = null, double playAreaRadius = 500)
|
||||
{
|
||||
Send(new CreateLobby
|
||||
{
|
||||
PlayAreaCenter = center,
|
||||
PlayAreaRadius = playAreaRadius,
|
||||
ImpostorCount = impostorCount,
|
||||
TaskCount = taskCount,
|
||||
Password = password
|
||||
});
|
||||
}
|
||||
|
||||
public void JoinLobby(string joinCode, string? password = null)
|
||||
{
|
||||
Send(new JoinLobby
|
||||
{
|
||||
JoinCode = joinCode.ToUpperInvariant(),
|
||||
Password = password
|
||||
});
|
||||
}
|
||||
|
||||
public void LeaveLobby()
|
||||
{
|
||||
Send(new LeaveLobby());
|
||||
LobbyId = null;
|
||||
JoinCode = null;
|
||||
}
|
||||
|
||||
public void StartGame()
|
||||
{
|
||||
Send(new StartGame());
|
||||
}
|
||||
|
||||
public void ReturnToLobby()
|
||||
{
|
||||
Send(new ReturnToLobby());
|
||||
}
|
||||
|
||||
public void UpdatePosition(Position position)
|
||||
{
|
||||
MyPosition = position;
|
||||
Send(new UpdatePosition { Position = position });
|
||||
}
|
||||
|
||||
public void Kill(string targetUuid)
|
||||
{
|
||||
Send(new KillAttempt { TargetClientUuid = targetUuid });
|
||||
}
|
||||
|
||||
public void ReportBody(string bodyId)
|
||||
{
|
||||
Send(new ReportBody { BodyId = bodyId });
|
||||
}
|
||||
|
||||
public void CallEmergencyMeeting()
|
||||
{
|
||||
Send(new CallEmergencyMeeting());
|
||||
}
|
||||
|
||||
public void Vote(string? targetUuid)
|
||||
{
|
||||
Send(new CastVote { TargetClientUuid = targetUuid });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pokus o dokončení tasku. Server ověří že hráč je na správné pozici.
|
||||
/// </summary>
|
||||
public void CompleteTask(string taskId)
|
||||
{
|
||||
Send(new TaskComplete { TaskId = taskId });
|
||||
}
|
||||
|
||||
public void SendPing()
|
||||
{
|
||||
Send(new Ping { ClientTime = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() });
|
||||
}
|
||||
|
||||
public void Reconnect(string lobbyId)
|
||||
{
|
||||
Send(new Reconnect { LobbyId = lobbyId, LastEventId = LastEventId });
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Helpers
|
||||
|
||||
public Body? FindNearbyBody(double maxDistance)
|
||||
{
|
||||
foreach (var body in Bodies)
|
||||
{
|
||||
if (MyPosition.DistanceTo(body.Location) <= maxDistance)
|
||||
{
|
||||
return body;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public string? FindNearbyPlayer(double maxDistance, bool aliveOnly = true)
|
||||
{
|
||||
foreach (var (uuid, info) in PlayerPositions)
|
||||
{
|
||||
if (uuid == ClientUuid) continue;
|
||||
if (aliveOnly && info.State != PlayerState.Alive) continue;
|
||||
|
||||
if (MyPosition.DistanceTo(info.Position) <= maxDistance)
|
||||
{
|
||||
return uuid;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public GameTask? FindNearbyTask(double maxDistance)
|
||||
{
|
||||
foreach (var task in MyTasks)
|
||||
{
|
||||
if (MyPosition.DistanceTo(task.Location) <= maxDistance)
|
||||
{
|
||||
return task;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Volat z Unity Update() pro zpracování callbacků
|
||||
public void Update()
|
||||
{
|
||||
Dispatcher.ProcessPendingActions();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
Disconnect("Disposed");
|
||||
_encryption?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
1054
Assets/ClientSDK/Protocol.cs
Normal file
1054
Assets/ClientSDK/Protocol.cs
Normal file
File diff suppressed because it is too large
Load Diff
1992
Assets/ClientSDK/SimulatorClient.cs
Normal file
1992
Assets/ClientSDK/SimulatorClient.cs
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -1,23 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 58ebc3ffa125a9949953f6704e0a8c39
|
||||
AudioImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 8
|
||||
defaultSettings:
|
||||
serializedVersion: 2
|
||||
loadType: 0
|
||||
sampleRateSetting: 0
|
||||
sampleRateOverride: 44100
|
||||
compressionFormat: 1
|
||||
quality: 1
|
||||
conversionMode: 0
|
||||
preloadAudioData: 0
|
||||
platformSettingOverrides: {}
|
||||
forceToMono: 0
|
||||
normalize: 1
|
||||
loadInBackground: 0
|
||||
ambisonic: 0
|
||||
3D: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
91
Assets/GameManager/GameManager.cs
Normal file
91
Assets/GameManager/GameManager.cs
Normal file
@@ -0,0 +1,91 @@
|
||||
using UnityEngine;
|
||||
using GeoSus.Client;
|
||||
using Subsystems;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using TMPro;
|
||||
/*
|
||||
GameManager - hlavní tøida pro správu hry
|
||||
GameManager_Network - subsystém pro správu komunikace se serverem
|
||||
GameManager_Game - subsystém pro správu logiky hry (sabotáže, tasky, atd.)
|
||||
GameManager_Map - subsystém pro správu mapy a prostøedí
|
||||
GameManager_Input - subsystém pro správu vstupu od hráèe
|
||||
GameManager_UI - subsystém pro správu uživatelského rozhraní
|
||||
GamaManager_Stats - subsystém pro správu statistik pro server
|
||||
*/
|
||||
public class GameManager : MonoBehaviour
|
||||
{
|
||||
[Header("Subsystems")]
|
||||
protected GameManager_Network networkSubsystem;
|
||||
protected GameManager_UI uiSubsystem;
|
||||
|
||||
|
||||
protected GameClient gameClient;
|
||||
[Header("Player Info")]
|
||||
public string displayName;
|
||||
|
||||
[Header("UI Elements")]
|
||||
public Canvas JoinCreateLobby;
|
||||
public Canvas InLobby;
|
||||
|
||||
void Start()
|
||||
{
|
||||
DontDestroyOnLoad(this);
|
||||
if (displayName == null || displayName == "")
|
||||
{
|
||||
displayName = "Player_" + Random.Range(1000, 9999).ToString();
|
||||
}
|
||||
gameClient = new GameClient(GenerateUUID(), /*displayName*/ GenerateUsername());
|
||||
uiSubsystem = new GameManager_UI(gameClient, JoinCreateLobby, InLobby);
|
||||
networkSubsystem = new GameManager_Network(gameClient);
|
||||
networkSubsystem.OpenConection();
|
||||
}
|
||||
private void Update()
|
||||
{
|
||||
if (gameClient.CurrentLobbyState != null)
|
||||
{
|
||||
uiSubsystem.UpdateLobbyUI();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected string GenerateUUID()
|
||||
{
|
||||
string UUID = System.Guid.NewGuid().ToString();
|
||||
Debug.Log(UUID);
|
||||
return UUID;
|
||||
}
|
||||
protected string GenerateUsername()
|
||||
{
|
||||
string Username = Random.Range(0,10).ToString() + Random.Range(0, 10).ToString() + Random.Range(0, 10).ToString() + Random.Range(0, 10).ToString();
|
||||
Debug.Log(Username);
|
||||
return Username;
|
||||
}
|
||||
public void CreateLobbyButton()
|
||||
{
|
||||
networkSubsystem.CrateLobby(50.0755, 14.4378);
|
||||
}
|
||||
public void JoinLobbyButton()
|
||||
{
|
||||
TMP_InputField joinCode = JoinCreateLobby.transform.Find("InputCode").GetComponent<TMP_InputField>();
|
||||
if (joinCode.text != null && joinCode.text != "")
|
||||
{
|
||||
networkSubsystem.JoinLobby(joinCode.text);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("Join code is empty!");
|
||||
}
|
||||
}
|
||||
public void LeaveLobbyButton()
|
||||
{
|
||||
networkSubsystem.LeaveLobby();
|
||||
}
|
||||
void OnApplicationQuit()
|
||||
{
|
||||
gameClient.Disconnect();
|
||||
}
|
||||
}
|
||||
2
Assets/GameManager/GameManager.cs.meta
Normal file
2
Assets/GameManager/GameManager.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 22bf82e679cf6e1419440d236360ba3b
|
||||
152
Assets/GameManager/GameManager_Network.cs
Normal file
152
Assets/GameManager/GameManager_Network.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using GeoSus.Client;
|
||||
using System.Collections;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Subsystems
|
||||
{
|
||||
public class GameManager_Network
|
||||
{
|
||||
private const string _serverAddress = "geosus.honzuvkod.dev";
|
||||
private const int _serverPort = 7777;
|
||||
private GameClient _gameClient;
|
||||
public async void OpenConection()
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
Task<bool> state = _gameClient.ConnectAsync(_serverAddress, _serverPort);
|
||||
await state;
|
||||
if (state.Result)
|
||||
{
|
||||
Debug.Log("Connected to server.");
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Log("Failed to connect to server");
|
||||
}
|
||||
await Task.Delay(5000);
|
||||
}
|
||||
}
|
||||
public GameManager_Network(GameClient gameClient)
|
||||
{
|
||||
_gameClient = gameClient;
|
||||
RegisterEventHandlers();
|
||||
}
|
||||
public void RegisterEventHandlers()
|
||||
{
|
||||
_gameClient.OnConnected += OnConnected;
|
||||
_gameClient.OnDisconnected += OnDisconnected;
|
||||
_gameClient.OnError += OnError;
|
||||
_gameClient.OnMessage += OnMessage;
|
||||
_gameClient.OnGameEvent += OnGameEvent;
|
||||
}
|
||||
private void OnConnected()
|
||||
{
|
||||
Debug.Log("Successfully connected to the server.");
|
||||
}
|
||||
private void OnDisconnected(string reason)
|
||||
{
|
||||
Debug.Log($"Host disconnected due to {reason}");
|
||||
}
|
||||
private void OnError(string error)
|
||||
{
|
||||
Debug.LogError($"Network error: {error}");
|
||||
}
|
||||
private void OnMessage(Message message)
|
||||
{
|
||||
switch (message.Type)
|
||||
{
|
||||
case "GameEvent":
|
||||
OnGameEvent(message as GameEvent);
|
||||
break;
|
||||
case "CreateLobbyResponse":
|
||||
Debug.Log("Received CreateLobbyResponse message");
|
||||
HandleCreateLobbyResponse(message as CreateLobbyResponse);
|
||||
break;
|
||||
case "JoinLobbyResponse":
|
||||
Debug.Log("Received JoinLobbyResponse message");
|
||||
HandleJoinLobbyResponse(message as JoinLobbyResponse);
|
||||
break;
|
||||
case "Ack":
|
||||
Debug.Log("Received Ack message");
|
||||
break;
|
||||
default:
|
||||
Debug.Log("Received message of type: " + message.Type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
private void OnGameEvent(GameEvent gameEvent)
|
||||
{
|
||||
switch (gameEvent.Type)
|
||||
{
|
||||
case "PlayerJoined":
|
||||
Debug.Log($"Player {gameEvent.GetPayload<PlayerJoinedPayload>().DisplayName} joined");
|
||||
HandlePlayerJoined(gameEvent);
|
||||
break;
|
||||
default:
|
||||
Debug.Log("Received GameEvent of type: " + gameEvent.Type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
private void HandleCreateLobbyResponse(CreateLobbyResponse message)
|
||||
{
|
||||
if (message.Success)
|
||||
{
|
||||
Debug.Log("Lobby created successfully. Join Code: " + message.JoinCode + ", Lobby ID: " + message.LobbyId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Failed to create lobby: " + message.Error);
|
||||
}
|
||||
}
|
||||
private void HandleJoinLobbyResponse(JoinLobbyResponse message)
|
||||
{
|
||||
if (message.Success)
|
||||
{
|
||||
Debug.Log("Lobby created successfully." + ", Lobby ID: " + message.LobbyId);
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Failed to create lobby: " + message.Error);
|
||||
}
|
||||
}
|
||||
private void HandlePlayerJoined(GameEvent gameEvent)
|
||||
{
|
||||
var payload = gameEvent.GetPayload<PlayerJoinedPayload>();
|
||||
_gameClient.CurrentLobbyState.Players.Add(new PlayerInfo
|
||||
{
|
||||
ClientUuid = payload.ClientUuid,
|
||||
DisplayName = payload.DisplayName,
|
||||
IsOwner = false,
|
||||
IsReady = false,
|
||||
State = PlayerState.Alive
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public void CrateLobby(double lat, double lon)
|
||||
{
|
||||
_gameClient.CreateLobby(new Position(lat, lon));
|
||||
}
|
||||
public void JoinLobby(string joinCode)
|
||||
{
|
||||
try
|
||||
{
|
||||
_gameClient.JoinLobby(joinCode);
|
||||
}
|
||||
catch (System.Exception ex)
|
||||
{
|
||||
Debug.LogError("Error joining lobby: " + ex.Message);
|
||||
}
|
||||
}
|
||||
public void LeaveLobby()
|
||||
{
|
||||
_gameClient.Disconnect();
|
||||
Application.Quit();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
2
Assets/GameManager/GameManager_Network.cs.meta
Normal file
2
Assets/GameManager/GameManager_Network.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 989e9292fe24c2a4ba95ceae191dd330
|
||||
35
Assets/GameManager/GameManager_UI.cs
Normal file
35
Assets/GameManager/GameManager_UI.cs
Normal file
@@ -0,0 +1,35 @@
|
||||
using UnityEngine;
|
||||
using Subsystems;
|
||||
using GeoSus.Client;
|
||||
using System.ComponentModel;
|
||||
|
||||
|
||||
namespace Subsystems
|
||||
{
|
||||
public class GameManager_UI
|
||||
{
|
||||
private GameClient _gameClient;
|
||||
private Canvas _CreateJoinLobby;
|
||||
private Canvas _InLobby;
|
||||
public GameManager_UI(GameClient gameClient, Canvas CreateJoinLobby, Canvas InLobby)
|
||||
{
|
||||
_gameClient = gameClient;
|
||||
_CreateJoinLobby = CreateJoinLobby;
|
||||
_InLobby = InLobby;
|
||||
_CreateJoinLobby.enabled = true;
|
||||
_InLobby.enabled = false;
|
||||
}
|
||||
public void UpdateLobbyUI()
|
||||
{
|
||||
_InLobby.enabled = true;
|
||||
_CreateJoinLobby.enabled = false;
|
||||
var playerList = _InLobby.transform.Find("PlayerList").GetComponent<TMPro.TMP_Text>();
|
||||
playerList.text = "";
|
||||
foreach (var player in _gameClient.CurrentLobbyState.Players)
|
||||
{
|
||||
playerList.text += player.DisplayName + "\n";
|
||||
}
|
||||
_InLobby.transform.Find("JoinCode").GetComponent<TMPro.TMP_Text>().text = _gameClient.CurrentLobbyState.JoinCode;
|
||||
}
|
||||
}
|
||||
}
|
||||
2
Assets/GameManager/GameManager_UI.cs.meta
Normal file
2
Assets/GameManager/GameManager_UI.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbe0afd6cfb57b44781533cfa4ce4196
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
using GeoSus.Client;
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 743fed9d96a90254c88556de9fee92b0
|
||||
guid: feb806f8c9bbde347862d714c4e96c61
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f6ce7f674a77664ead5dbb89193e587
|
||||
guid: 624830e44386e5d45a391630cd88151d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
84
Assets/MainScreenUI/Materials/Zeme_Textura.mat
Normal file
84
Assets/MainScreenUI/Materials/Zeme_Textura.mat
Normal file
@@ -0,0 +1,84 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Zeme_Textura
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: d1443c0777d81e24caecc3991b8bf225, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -1,8 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 18829ddd933a57c489872a4f1a3942e4
|
||||
guid: 299795d658d037841b1552f783d462c3
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
17
Assets/MainScreenUI/RotaceZeme.cs
Normal file
17
Assets/MainScreenUI/RotaceZeme.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using UnityEngine;
|
||||
//clankr
|
||||
public class RotaceZeme : MonoBehaviour
|
||||
{
|
||||
public float rychlost = 20f;
|
||||
// Start is called once before the first execution of Update after the MonoBehaviour is created
|
||||
void Start()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
transform.Rotate(Vector3.up, rychlost * Time.deltaTime);
|
||||
}
|
||||
}
|
||||
2
Assets/MainScreenUI/RotaceZeme.cs.meta
Normal file
2
Assets/MainScreenUI/RotaceZeme.cs.meta
Normal file
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2167308ece2e6664fa472e3dff700350
|
||||
84
Assets/MainScreenUI/Zeme_Material.mat
Normal file
84
Assets/MainScreenUI/Zeme_Material.mat
Normal file
@@ -0,0 +1,84 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Zeme_Material
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 2800000, guid: d1443c0777d81e24caecc3991b8bf225, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.414
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
8
Assets/MainScreenUI/Zeme_Material.mat.meta
Normal file
8
Assets/MainScreenUI/Zeme_Material.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4cf6d1d65bc4af24fa762f6801fcc7c4
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/MainScreenUI/Zeme_Textura.png
Normal file
BIN
Assets/MainScreenUI/Zeme_Textura.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 404 KiB |
143
Assets/MainScreenUI/Zeme_Textura.png.meta
Normal file
143
Assets/MainScreenUI/Zeme_Textura.png.meta
Normal file
@@ -0,0 +1,143 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d1443c0777d81e24caecc3991b8bf225
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 2
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: iOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
39
Assets/MainScreenUI/Zeme_vystup.renderTexture
Normal file
39
Assets/MainScreenUI/Zeme_vystup.renderTexture
Normal file
@@ -0,0 +1,39 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!84 &8400000
|
||||
RenderTexture:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Zeme_vystup
|
||||
m_ImageContentsHash:
|
||||
serializedVersion: 2
|
||||
Hash: 00000000000000000000000000000000
|
||||
m_IsAlphaChannelOptional: 0
|
||||
serializedVersion: 6
|
||||
m_Width: 1048
|
||||
m_Height: 1048
|
||||
m_AntiAliasing: 1
|
||||
m_MipCount: -1
|
||||
m_DepthStencilFormat: 94
|
||||
m_ColorFormat: 8
|
||||
m_MipMap: 0
|
||||
m_GenerateMips: 1
|
||||
m_SRGB: 0
|
||||
m_UseDynamicScale: 0
|
||||
m_UseDynamicScaleExplicit: 0
|
||||
m_BindMS: 0
|
||||
m_EnableCompatibleFormat: 1
|
||||
m_EnableRandomWrite: 0
|
||||
m_TextureSettings:
|
||||
serializedVersion: 2
|
||||
m_FilterMode: 1
|
||||
m_Aniso: 0
|
||||
m_MipBias: 0
|
||||
m_WrapU: 1
|
||||
m_WrapV: 1
|
||||
m_WrapW: 1
|
||||
m_Dimension: 2
|
||||
m_VolumeDepth: 1
|
||||
m_ShadowSamplingMode: 2
|
||||
8
Assets/MainScreenUI/Zeme_vystup.renderTexture.meta
Normal file
8
Assets/MainScreenUI/Zeme_vystup.renderTexture.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4d595312cdcdd094cbe411227603ceea
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 8400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/MainScreenUI/Zmekole_geosusv2.fbx
Normal file
BIN
Assets/MainScreenUI/Zmekole_geosusv2.fbx
Normal file
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7fd80bd46d706b042a137593bf706d58
|
||||
guid: 0e125acbe6e192344a3f1c6d4a54f131
|
||||
ModelImporter:
|
||||
serializedVersion: 24200
|
||||
internalIDToNameTable: []
|
||||
84
Assets/MainScreenUI/textik.mat
Normal file
84
Assets/MainScreenUI/textik.mat
Normal file
@@ -0,0 +1,84 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: textik
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.583
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
8
Assets/MainScreenUI/textik.mat.meta
Normal file
8
Assets/MainScreenUI/textik.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e00f6447ca0dc7646b73cb387d282a47
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
37
Assets/Materials/HDR_multi_nebulae_1.mat
Normal file
37
Assets/Materials/HDR_multi_nebulae_1.mat
Normal file
@@ -0,0 +1,37 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: HDR_multi_nebulae_1
|
||||
m_Shader: {fileID: 103, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _Tex:
|
||||
m_Texture: {fileID: 8900000, guid: bbe6dc8ab03108a488246bb64d4078ff, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _Exposure: 1
|
||||
- _Rotation: 0
|
||||
m_Colors:
|
||||
- _Tint: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
8
Assets/Materials/HDR_multi_nebulae_1.mat.meta
Normal file
8
Assets/Materials/HDR_multi_nebulae_1.mat.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8ea26def9472484b87d08513faa2756
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
84
Assets/New Material.mat
Normal file
84
Assets/New Material.mat
Normal file
@@ -0,0 +1,84 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: New Material
|
||||
m_Shader: {fileID: 46, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _BumpMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailAlbedoMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailMask:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _DetailNormalMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _EmissionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MetallicGlossMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _OcclusionMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _ParallaxMap:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _BumpScale: 1
|
||||
- _Cutoff: 0.5
|
||||
- _DetailNormalMapScale: 1
|
||||
- _DstBlend: 0
|
||||
- _GlossMapScale: 1
|
||||
- _Glossiness: 0.5
|
||||
- _GlossyReflections: 1
|
||||
- _Metallic: 0
|
||||
- _Mode: 0
|
||||
- _OcclusionStrength: 1
|
||||
- _Parallax: 0.02
|
||||
- _SmoothnessTextureChannel: 0
|
||||
- _SpecularHighlights: 1
|
||||
- _SrcBlend: 1
|
||||
- _UVSec: 0
|
||||
- _ZWrite: 1
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -1,34 +0,0 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: fcf7219bab7fe46a1ad266029b2fee19, type: 3}
|
||||
m_Name: Readme
|
||||
m_EditorClassIdentifier:
|
||||
icon: {fileID: 2800000, guid: 727a75301c3d24613a3ebcec4a24c2c8, type: 3}
|
||||
title: URP Empty Template
|
||||
sections:
|
||||
- heading: Welcome to the Universal Render Pipeline
|
||||
text: This template includes the settings and assets you need to start creating with the Universal Render Pipeline.
|
||||
linkText:
|
||||
url:
|
||||
- heading: URP Documentation
|
||||
text:
|
||||
linkText: Read more about URP
|
||||
url: https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest
|
||||
- heading: Forums
|
||||
text:
|
||||
linkText: Get answers and support
|
||||
url: https://forum.unity.com/forums/universal-render-pipeline.383/
|
||||
- heading: Report bugs
|
||||
text:
|
||||
linkText: Submit a report
|
||||
url: https://unity3d.com/unity/qa/bug-reporting
|
||||
loadedLayout: 1
|
||||
2245
Assets/Scenes/Client.unity
Normal file
2245
Assets/Scenes/Client.unity
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bfd97d0fee743f945a3d47b571fe9f20
|
||||
guid: 99349b837685d91408e5eb5bac237678
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3c41f51487bbe394b9b8568d1b254bd4
|
||||
guid: 0d2bf6fbc15c94c4db51c326dbaa84ee
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
1700
Assets/Scenes/Main Screen Scenes/are u sure.unity
Normal file
1700
Assets/Scenes/Main Screen Scenes/are u sure.unity
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7717e22d410f9a444be1699f27f08476
|
||||
guid: 42774ddf02ffd1747898d12625c667b0
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b8ce5b30e6200134bae071db3ae43149
|
||||
guid: 3347745980e97824f9dda5b6043b57e7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
Binary file not shown.
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 26709d992d8a99b4791083f116c56a36
|
||||
guid: fa27202025a24b6418e644af57608959
|
||||
AudioImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 8
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74c99196e7d046a4497d6aa5ba358650
|
||||
guid: 6b025445e5a6de74780d752e5354a0a9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,143 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bbe6dc8ab03108a488246bb64d4078ff
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 1
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 0
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 0
|
||||
textureShape: 2
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: iOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0cff73c6845b7cb40877239c2a7e25fc
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,37 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: HDR_multi_nebulae_1
|
||||
m_Shader: {fileID: 103, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _Tex:
|
||||
m_Texture: {fileID: 8900000, guid: bbe6dc8ab03108a488246bb64d4078ff, type: 3}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _Exposure: 1
|
||||
- _Rotation: 0
|
||||
m_Colors:
|
||||
- _Tint: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 628af2744593aaf4fbadc7aec37b8b41
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 52bdfdf1d7e2c6c40a8cdd507da420a8
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a173f2d64d95c1a4f804bea472fbde86
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1957a0d79dde42e4f87f545f2382a021
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d85917757cff61e46bfbffa6ca06d452
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 883a00b104e0a9f4195fa2ed71d989e6
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 635ebc63895da35489dd1dba41818ea5
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8c12c1f44e7180c4caf6d4a2d8690d7a
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ac97b3e85e9597848a8eb1b9e30e59a9
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 324e45e0718fdb44ca40dfde0812dd33
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f264d72c6679ab4393c88b7a78aaf6a
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4fd8bc71bae2ede41a6ae4eb91913236
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 50c6d237583d76d4bbd65fea0f7c92e2
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fefbc330c0e86ef43a97fb476e9b0783
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4339700de0751774da9c5890da773023
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a36dfaed1675be1408198118d6833d59
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f5e78d40275d15f4b9290d113a80ea8b
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because one or more lines are too long
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9496285097e5d904da120cdcec6534dc
|
||||
guid: 8a13e20c49f7db440aa1e34c53005080
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0a66ee802c65aa84abf1b5a98d05c226
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 75dccbc62be30734ebd6f3c655a931cd
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
@@ -0,0 +1,21 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f062dd6db98f07a4db0ada7644cafc09
|
||||
TrueTypeFontImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 4
|
||||
fontSize: 16
|
||||
forceTextureCase: -2
|
||||
characterSpacing: 0
|
||||
characterPadding: 1
|
||||
includeFontData: 1
|
||||
fontNames:
|
||||
- Nunito
|
||||
fallbackFontReferences: []
|
||||
customCharacters:
|
||||
fontRenderingMode: 0
|
||||
ascentCalculationMode: 1
|
||||
useLegacyBoundsCalculation: 0
|
||||
shouldRoundAdvanceValue: 1
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
1700
Assets/Scenes/Main Screen Scenes/aus hrac.unity
Normal file
1700
Assets/Scenes/Main Screen Scenes/aus hrac.unity
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8f9e944b2f23a444588ce2e4ac78b0f0
|
||||
guid: 60b609405d1182342a835866a25ce8ae
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
1319
Assets/Scenes/Main Screen Scenes/bubak.unity
Normal file
1319
Assets/Scenes/Main Screen Scenes/bubak.unity
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74379ac554348f84c8d3abeb440b79b9
|
||||
guid: 2ac55b32f60c0f44691e1588d19d610f
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
2319
Assets/Scenes/Main Screen Scenes/create.unity
Normal file
2319
Assets/Scenes/Main Screen Scenes/create.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Main Screen Scenes/create.unity.meta
Normal file
7
Assets/Scenes/Main Screen Scenes/create.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bb0f4b90bb4ebfe47b92da609060694b
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
2293
Assets/Scenes/Main Screen Scenes/host a join.unity
Normal file
2293
Assets/Scenes/Main Screen Scenes/host a join.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Main Screen Scenes/host a join.unity.meta
Normal file
7
Assets/Scenes/Main Screen Scenes/host a join.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7555f1f2ac99b4e4f8a21ad9ca5fc1dc
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
2066
Assets/Scenes/Main Screen Scenes/host lobby.unity
Normal file
2066
Assets/Scenes/Main Screen Scenes/host lobby.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Main Screen Scenes/host lobby.unity.meta
Normal file
7
Assets/Scenes/Main Screen Scenes/host lobby.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2abd1bf51796b0c4ea1347cfd0f5351f
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user