Compare commits
1 Commits
VerticalBi
...
Kabely
| Author | SHA1 | Date | |
|---|---|---|---|
| 5f9f47202b |
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 50a0b21c151e150428fd2803d6b95db0
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,285 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: bc06bb57786c7e142b06ec231e5cf709
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 1d2251b279edb0147bd274a884ac878b
|
|
||||||
@@ -1,607 +0,0 @@
|
|||||||
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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 91e0f647c37b0b94b83f53bb854db28c
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 14463228dfea2264ebfc36c3a7dc4b99
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 80ef0979df5d1fe489225f3e5edadc5c
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 3a4035bdb812fee4f96cb1aa1b24c999
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 131d9de257c8edc49991d792c6e702f6
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: bbd26b895bc2b894b8989c08d9fd9197
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
%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: AreaMat
|
|
||||||
m_Shader: {fileID: 10753, 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:
|
|
||||||
- _AlphaTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _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:
|
|
||||||
- PixelSnap: 0
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _EnableExternalAlpha: 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: 0.0813297, g: 1, b: 0, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 5a46533bdf4003449bc9146ccef44e27
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,148 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
using GeoSus.Client;
|
|
||||||
using Subsystems;
|
|
||||||
using System.Collections;
|
|
||||||
using System;
|
|
||||||
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 GameManager_Map mapSubsystem;
|
|
||||||
protected GameManager_Input inputSubsystem;
|
|
||||||
|
|
||||||
protected GameClient gameClient;
|
|
||||||
|
|
||||||
[Header("Player Info")]
|
|
||||||
public string displayName;
|
|
||||||
|
|
||||||
[Header("UI Elements")]
|
|
||||||
public Canvas JoinCreateLobby;
|
|
||||||
public Canvas InLobby;
|
|
||||||
public Canvas LoadingScreen;
|
|
||||||
public Canvas GameScreen;
|
|
||||||
|
|
||||||
|
|
||||||
[Header("Map")]
|
|
||||||
public GameObject MapCenterPoint;
|
|
||||||
public BuildingSettings buildingSettings;
|
|
||||||
public PathwaySettings pathwaySettings;
|
|
||||||
public AreaSettings areaSettings;
|
|
||||||
|
|
||||||
[Header("GPS")]
|
|
||||||
public GameObject Player;
|
|
||||||
|
|
||||||
[Header("Debug")]
|
|
||||||
public bool testMode = false;
|
|
||||||
private GameClient _secondClient;
|
|
||||||
private GameClient _thirdClient;
|
|
||||||
private GameManager_Network _secondNetwork;
|
|
||||||
private GameManager_Network _thirdNetwork;
|
|
||||||
|
|
||||||
|
|
||||||
void Start()
|
|
||||||
{
|
|
||||||
DontDestroyOnLoad(this);
|
|
||||||
if (displayName == null || displayName == "")
|
|
||||||
{
|
|
||||||
displayName = GenerateUsername();
|
|
||||||
}
|
|
||||||
if (testMode)
|
|
||||||
{
|
|
||||||
_secondClient = new GameClient(GenerateUUID(), GenerateUsername());
|
|
||||||
_secondNetwork = new GameManager_Network(_secondClient);
|
|
||||||
_thirdClient = new GameClient(GenerateUUID(), GenerateUsername());
|
|
||||||
_thirdNetwork = new GameManager_Network(_thirdClient);
|
|
||||||
|
|
||||||
_secondNetwork.OpenConection();
|
|
||||||
_thirdNetwork.OpenConection();
|
|
||||||
}
|
|
||||||
gameClient = new GameClient(GenerateUUID(), displayName);
|
|
||||||
uiSubsystem = new GameManager_UI(gameClient, JoinCreateLobby, InLobby, LoadingScreen, GameScreen);
|
|
||||||
networkSubsystem = new GameManager_Network(gameClient);
|
|
||||||
mapSubsystem = new GameManager_Map(gameClient, MapCenterPoint, buildingSettings, pathwaySettings, areaSettings);
|
|
||||||
inputSubsystem = new GameManager_Input(gameClient, Player, testMode);
|
|
||||||
networkSubsystem.OpenConection();
|
|
||||||
}
|
|
||||||
private void Update()
|
|
||||||
{
|
|
||||||
if (gameClient.CurrentLobbyState != null)
|
|
||||||
{
|
|
||||||
uiSubsystem.UpdateLobbyUI();
|
|
||||||
}
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (gameClient.CurrentLobbyState.MapDataReady)
|
|
||||||
{
|
|
||||||
mapSubsystem.BuildMap();
|
|
||||||
gameClient.CurrentLobbyState.MapDataReady = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (NullReferenceException ex) { }
|
|
||||||
inputSubsystem.positionCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
protected string GenerateUUID()
|
|
||||||
{
|
|
||||||
string UUID = System.Guid.NewGuid().ToString();
|
|
||||||
Debug.Log(UUID);
|
|
||||||
return UUID;
|
|
||||||
}
|
|
||||||
protected string GenerateUsername()
|
|
||||||
{
|
|
||||||
string Username = UnityEngine.Random.Range(0,10).ToString() + UnityEngine.Random.Range(0, 10).ToString() + UnityEngine.Random.Range(0, 10).ToString() + UnityEngine.Random.Range(0, 10).ToString();
|
|
||||||
Debug.Log(Username);
|
|
||||||
return Username;
|
|
||||||
}
|
|
||||||
public void CreateLobbyButton()
|
|
||||||
{
|
|
||||||
networkSubsystem.CrateLobby(50.7727264, 15.0719876);
|
|
||||||
if (testMode)
|
|
||||||
{
|
|
||||||
StartCoroutine(ConnectTestClients());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
public void StartGameButton()
|
|
||||||
{
|
|
||||||
networkSubsystem.StartGame();
|
|
||||||
}
|
|
||||||
void OnApplicationQuit()
|
|
||||||
{
|
|
||||||
gameClient.Disconnect();
|
|
||||||
_secondClient?.Disconnect();
|
|
||||||
_thirdClient?.Disconnect();
|
|
||||||
}
|
|
||||||
IEnumerator ConnectTestClients()
|
|
||||||
{
|
|
||||||
yield return new WaitForSeconds(2f);
|
|
||||||
_secondNetwork.JoinLobby(gameClient.CurrentLobbyState.JoinCode);
|
|
||||||
_thirdNetwork.JoinLobby(gameClient.CurrentLobbyState.JoinCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 22bf82e679cf6e1419440d236360ba3b
|
|
||||||
@@ -1,254 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
using GeoSus.Client;
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
|
|
||||||
namespace Subsystems
|
|
||||||
{
|
|
||||||
internal class CoroutineHost : MonoBehaviour
|
|
||||||
{
|
|
||||||
public CoroutineHost() { }
|
|
||||||
}
|
|
||||||
internal enum GPSState
|
|
||||||
{
|
|
||||||
Uninitialized,
|
|
||||||
Initializing,
|
|
||||||
Running,
|
|
||||||
Failed
|
|
||||||
}
|
|
||||||
public static class PositonExtensions
|
|
||||||
{
|
|
||||||
public static Position ToLocal(this Position position, Position center)
|
|
||||||
{
|
|
||||||
double latDiff = position.Lat - center.Lat;
|
|
||||||
double lonDiff = position.Lon - center.Lon;
|
|
||||||
double metersPerDegreeLat = 111320.0;
|
|
||||||
double metersPerDegreeLon = 111320.0 * Math.Cos(center.Lat * Math.PI / 180.0);
|
|
||||||
float x = (float)(lonDiff * metersPerDegreeLon);
|
|
||||||
float z = (float)(latDiff * metersPerDegreeLat);
|
|
||||||
return new Position(z, x);
|
|
||||||
}
|
|
||||||
public static Vector3 ToLocalVector3(this Position position, Position center)
|
|
||||||
{
|
|
||||||
return position.ToLocal(center).ToVector3(); //TODO: Implementace v subsystemech
|
|
||||||
}
|
|
||||||
public static Vector3 ToVector3(this Position position)
|
|
||||||
{
|
|
||||||
return new Vector3((float)position.Lon, 0, (float)position.Lat); //TODO: Implementace v subsystemech
|
|
||||||
}
|
|
||||||
public static double DistanceTo(this Vector3 pos, Vector3 other)
|
|
||||||
{
|
|
||||||
return Math.Sqrt((other.x - pos.x) * (other.x - pos.x) + (other.z - pos.z) * (other.z - pos.z));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GameManager_Input
|
|
||||||
{
|
|
||||||
private GameClient _gameClient;
|
|
||||||
private Position _currentPosition;
|
|
||||||
private Position _lastSentPosition;
|
|
||||||
private GameObject _player;
|
|
||||||
private bool _testMode;
|
|
||||||
|
|
||||||
private GPSState _GPSState = GPSState.Uninitialized;
|
|
||||||
private float _speed = 0.00001f;
|
|
||||||
private Position _mapCenter;
|
|
||||||
private CoroutineHost _coroutineHost = new CoroutineHost();
|
|
||||||
public GameManager_Input(GameClient gameClient, GameObject player, bool testMode)
|
|
||||||
{
|
|
||||||
_gameClient = gameClient;
|
|
||||||
_player = player;
|
|
||||||
_testMode = testMode;
|
|
||||||
}
|
|
||||||
public void positionCheck()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_gameClient.CurrentLobbyState.Phase == GamePhase.Playing)
|
|
||||||
{
|
|
||||||
if (_testMode)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (_currentPosition == null || _currentPosition == new Position(0, 0))
|
|
||||||
{
|
|
||||||
//Init blok
|
|
||||||
_currentPosition = _gameClient.CurrentLobbyState.MapData.Center;
|
|
||||||
_mapCenter = _gameClient.CurrentLobbyState.MapData.Center;
|
|
||||||
_lastSentPosition = _currentPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
TestPlayerPosition();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (_GPSState == GPSState.Uninitialized)
|
|
||||||
{
|
|
||||||
_coroutineHost.StartCoroutine(InitiallizeGPS());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (_GPSState == GPSState.Initializing)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (_GPSState == GPSState.Running)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_currentPosition != _lastSentPosition)
|
|
||||||
{
|
|
||||||
_gameClient.UpdatePosition(_currentPosition);
|
|
||||||
_lastSentPosition = _currentPosition;
|
|
||||||
_player.transform.position = _currentPosition.ToLocalVector3(_mapCenter);
|
|
||||||
_player.transform.rotation = Quaternion.Euler(0, (float)CalculateHeading(_lastSentPosition.ToLocalVector3(_mapCenter), _currentPosition.ToLocalVector3(_mapCenter)), 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Debug.Log(ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Debug.Log("GPS failed, trying again...");
|
|
||||||
_GPSState = GPSState.Uninitialized;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (NullReferenceException ex) { Debug.Log(ex); }
|
|
||||||
}
|
|
||||||
private void TestPlayerPosition()
|
|
||||||
{
|
|
||||||
double x = Input.GetAxis("Horizontal");
|
|
||||||
double y = Input.GetAxis("Vertical");
|
|
||||||
Debug.Log($"Input: {x}, {y}");
|
|
||||||
_currentPosition = new Position( _lastSentPosition.Lat + y * _speed, _lastSentPosition.Lon + x * _speed);
|
|
||||||
Debug.Log($"Current Position: {_currentPosition.Lat}, {_currentPosition.Lon}");
|
|
||||||
var localCurrent = _currentPosition.ToLocalVector3(_mapCenter);
|
|
||||||
Debug.Log($"Local Current Position: {localCurrent}");
|
|
||||||
var heading = CalculateHeading(_lastSentPosition.ToLocalVector3(_mapCenter), localCurrent);
|
|
||||||
if (heading != null)
|
|
||||||
{
|
|
||||||
Debug.Log($"Heading: {heading}");
|
|
||||||
_player.transform.rotation = Quaternion.Euler(0, (float)heading, 0);
|
|
||||||
}
|
|
||||||
_player.transform.position = localCurrent;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (_currentPosition != _lastSentPosition)
|
|
||||||
{
|
|
||||||
_gameClient.UpdatePosition(_currentPosition);
|
|
||||||
_lastSentPosition = _currentPosition;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{
|
|
||||||
_gameClient.UpdatePosition(_currentPosition);
|
|
||||||
_lastSentPosition = _currentPosition;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
private double? CalculateHeading(Vector3 first, Vector3 second)
|
|
||||||
{
|
|
||||||
double? heading = null;
|
|
||||||
if ((first - second).magnitude == 0)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
else if (first.x == second.x && first.z < second.z)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
else if (first.x == second.x && first.z > second.z)
|
|
||||||
{
|
|
||||||
return 180;
|
|
||||||
}
|
|
||||||
else if (first.x > second.x && first.z == second.z)
|
|
||||||
{
|
|
||||||
return 270;
|
|
||||||
}
|
|
||||||
else if (first.x < second.x && first.z == second.z)
|
|
||||||
{
|
|
||||||
return 90;
|
|
||||||
}
|
|
||||||
else if (first.x < second.x && first.z < second.z)
|
|
||||||
{
|
|
||||||
heading = Math.Asin((second.z - first.z) / first.DistanceTo(second));
|
|
||||||
return (heading * 180) / Math.PI;
|
|
||||||
}
|
|
||||||
else if (first.x < second.x && first.z > second.z)
|
|
||||||
{
|
|
||||||
heading = Math.Asin((second.z - first.z) / first.DistanceTo(second));
|
|
||||||
return (heading * 180) / Math.PI + 180;
|
|
||||||
}
|
|
||||||
else if (first.x > second.x && first.z < second.z)
|
|
||||||
{
|
|
||||||
heading = Math.Asin((second.z - first.z) / first.DistanceTo(second));
|
|
||||||
return (heading * 180) / Math.PI - 90;
|
|
||||||
}
|
|
||||||
else if (first.x > second.x && first.z > second.z)
|
|
||||||
{
|
|
||||||
heading = Math.Asin((second.z - first.z) / first.DistanceTo(second));
|
|
||||||
return (heading * 180) / Math.PI - 90;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
return heading;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
IEnumerator InitiallizeGPS()
|
|
||||||
{
|
|
||||||
_GPSState = GPSState.Initializing;
|
|
||||||
if (!Input.location.isEnabledByUser)
|
|
||||||
{
|
|
||||||
Debug.LogError("Location not enabled on device or app does not have permission to access location");
|
|
||||||
}
|
|
||||||
// Starts the location service.
|
|
||||||
|
|
||||||
float desiredAccuracyInMeters = 10f;
|
|
||||||
float updateDistanceInMeters = 10f;
|
|
||||||
|
|
||||||
Input.location.Start(desiredAccuracyInMeters, updateDistanceInMeters);
|
|
||||||
|
|
||||||
// Waits until the location service initializes
|
|
||||||
int maxWait = 20;
|
|
||||||
while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)
|
|
||||||
{
|
|
||||||
yield return new WaitForSeconds(1);
|
|
||||||
maxWait--;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the service didn't initialize in 20 seconds this cancels location service use.
|
|
||||||
if (maxWait < 1)
|
|
||||||
{
|
|
||||||
_GPSState = GPSState.Failed;
|
|
||||||
Debug.LogError("Timed out");
|
|
||||||
yield break;
|
|
||||||
}
|
|
||||||
_GPSState = GPSState.Running;
|
|
||||||
yield return _coroutineHost.StartCoroutine(GPSService());
|
|
||||||
}
|
|
||||||
IEnumerator GPSService()
|
|
||||||
{
|
|
||||||
// Check if the user has location service enabled.
|
|
||||||
|
|
||||||
|
|
||||||
// If the connection failed this cancels location service use.
|
|
||||||
if (Input.location.status == LocationServiceStatus.Failed)
|
|
||||||
{
|
|
||||||
Debug.LogError("Unable to determine device location");
|
|
||||||
yield break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// If the connection succeeded, this retrieves the device's current location and displays it in the Console window.
|
|
||||||
_currentPosition = new Position(Input.location.lastData.latitude, Input.location.lastData.longitude);
|
|
||||||
Debug.Log("Location: " + Input.location.lastData.latitude + " " + Input.location.lastData.longitude + " " + Input.location.lastData.altitude + " " + Input.location.lastData.horizontalAccuracy + " " + Input.location.lastData.timestamp);
|
|
||||||
yield return new WaitForSeconds(5f);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stops the location service if there is no need to query location updates continuously.
|
|
||||||
yield return _coroutineHost.StartCoroutine(GPSService());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 2ef1abfb1e85a7943925f9dc3cfea742
|
|
||||||
@@ -1,376 +0,0 @@
|
|||||||
using GeoSus.Client;
|
|
||||||
using System;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
|
||||||
using UnityEditor;
|
|
||||||
using UnityEngine;
|
|
||||||
using UnityEngine.Localization.Pseudo;
|
|
||||||
using UnityEngine.UI;
|
|
||||||
|
|
||||||
|
|
||||||
namespace Subsystems{
|
|
||||||
[System.Serializable]
|
|
||||||
public class BuildingSettings
|
|
||||||
{
|
|
||||||
public Material ResidentalBuildingsMat;
|
|
||||||
public float ResidentalBuildingHeight;
|
|
||||||
public Material CommercialBuildingsMat;
|
|
||||||
public float CommercialBuildingHeight;
|
|
||||||
public Material IndustrialBuildingsMat;
|
|
||||||
public float IndustrialBuildingHeight;
|
|
||||||
public Material DefaultBuildingMat;
|
|
||||||
public float DefaultBuildingHeight;
|
|
||||||
}
|
|
||||||
[System.Serializable]
|
|
||||||
public class PathwaySettings
|
|
||||||
{
|
|
||||||
public Material FootwayMat;
|
|
||||||
public float FootwayWidth;
|
|
||||||
public Material PathMat;
|
|
||||||
public float PathWidth;
|
|
||||||
public Material StepsMat;
|
|
||||||
public float StepsWidth;
|
|
||||||
public Material CyclewayMat;
|
|
||||||
public float CyclewayWidth;
|
|
||||||
public Material PedestrianMat;
|
|
||||||
public float PedestrianWidth;
|
|
||||||
public Material RoadMat;
|
|
||||||
public float RoadWidth;
|
|
||||||
public Material ServiceMat;
|
|
||||||
public float ServiceWidth;
|
|
||||||
public Material ResidentialMat;
|
|
||||||
public float ResidentialWidth;
|
|
||||||
public Material TrackMat;
|
|
||||||
public float TrackWidth;
|
|
||||||
public Material DefaultMat;
|
|
||||||
public float DefaultWidth;
|
|
||||||
}
|
|
||||||
[System.Serializable]
|
|
||||||
public class AreaSettings
|
|
||||||
{
|
|
||||||
public Material ParkMat;
|
|
||||||
public Material GardenMat;
|
|
||||||
public Material PlaygroundMat;
|
|
||||||
public Material ForestMat;
|
|
||||||
public Material GrassMat;
|
|
||||||
public Material WaterMat;
|
|
||||||
public Material DefaultMat;
|
|
||||||
}
|
|
||||||
public class GameManager_Map
|
|
||||||
{
|
|
||||||
private GameClient _gameClient;
|
|
||||||
private GameObject _mapCenterPoint;
|
|
||||||
private Position _centerPosition;
|
|
||||||
private BuildingSettings _buildingSettings;
|
|
||||||
private PathwaySettings _pathwaySettings;
|
|
||||||
private AreaSettings _areaSettings;
|
|
||||||
private const float _metersPerUnit = 1f;
|
|
||||||
public GameManager_Map(GameClient gameClient, GameObject mapCenterPoint, BuildingSettings buildingSettings, PathwaySettings pathwaySettings, AreaSettings areaSettings)
|
|
||||||
{
|
|
||||||
_gameClient = gameClient;
|
|
||||||
_mapCenterPoint = mapCenterPoint;
|
|
||||||
_buildingSettings = buildingSettings;
|
|
||||||
_pathwaySettings = pathwaySettings;
|
|
||||||
_areaSettings = areaSettings;
|
|
||||||
}
|
|
||||||
public void BuildMap()
|
|
||||||
{
|
|
||||||
ClearChildren();
|
|
||||||
_centerPosition = _gameClient.CurrentLobbyState.MapData.Center;
|
|
||||||
GameObject buildingsRoot = new GameObject("Buildings");
|
|
||||||
buildingsRoot.transform.parent = _mapCenterPoint.transform;
|
|
||||||
|
|
||||||
GameObject pathRoot = new GameObject("Pathways");
|
|
||||||
pathRoot.transform.parent = _mapCenterPoint.transform;
|
|
||||||
|
|
||||||
GameObject areaRoot = new GameObject("Areas");
|
|
||||||
areaRoot.transform.parent = _mapCenterPoint.transform;
|
|
||||||
|
|
||||||
foreach (var building in _gameClient.CurrentLobbyState.MapData.GetBuildings())
|
|
||||||
{
|
|
||||||
string buildingType = "Unknown";
|
|
||||||
try
|
|
||||||
{
|
|
||||||
buildingType = _gameClient.CurrentLobbyState.MapData.BuildingTypes[_gameClient.CurrentLobbyState.MapData.GetBuildings().IndexOf(building)];
|
|
||||||
}
|
|
||||||
catch (Exception ex) { Debug.Log($"Error: {ex.Message}"); }
|
|
||||||
building.Name = buildingType;
|
|
||||||
GameObject b = BuildBuildingMesh(building);
|
|
||||||
b.transform.parent = buildingsRoot.transform;
|
|
||||||
}
|
|
||||||
foreach (var path in _gameClient.CurrentLobbyState.MapData.GetPathways())
|
|
||||||
{
|
|
||||||
GameObject p = BuildPathwayMesh(path);
|
|
||||||
p.transform.parent = pathRoot.transform;
|
|
||||||
}
|
|
||||||
foreach (var area in _gameClient.CurrentLobbyState.MapData.GetAreas())
|
|
||||||
{
|
|
||||||
GameObject a = BuildAreaMesh(area);
|
|
||||||
a.transform.parent = areaRoot.transform;
|
|
||||||
}
|
|
||||||
//TODO: POIs
|
|
||||||
}
|
|
||||||
void ClearChildren()
|
|
||||||
{
|
|
||||||
List<GameObject> toDestroy = new List<GameObject>();
|
|
||||||
foreach (Transform t in _mapCenterPoint.transform)
|
|
||||||
toDestroy.Add(t.gameObject);
|
|
||||||
foreach (var g in toDestroy)
|
|
||||||
{
|
|
||||||
UnityEngine.Object.DestroyImmediate(g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#region Mesh Building
|
|
||||||
GameObject BuildBuildingMesh(MapBuilding b)
|
|
||||||
{
|
|
||||||
var building = new GameObject($"Building_{b.Name ?? "Unknown"}");
|
|
||||||
|
|
||||||
// Výpočet středu budovy
|
|
||||||
Vector3 center = CalculatePolygonCenter(b.Outline);
|
|
||||||
building.transform.position = center;
|
|
||||||
|
|
||||||
// Vytvoření mesh pro budovu
|
|
||||||
MeshFilter meshFilter = building.AddComponent<MeshFilter>();
|
|
||||||
MeshRenderer meshRenderer = building.AddComponent<MeshRenderer>();
|
|
||||||
|
|
||||||
float height;
|
|
||||||
Material mat;
|
|
||||||
switch (b.BuildingType.ToLower())
|
|
||||||
{
|
|
||||||
case "residential":
|
|
||||||
mat = _buildingSettings.ResidentalBuildingsMat;
|
|
||||||
height = _buildingSettings.ResidentalBuildingHeight;
|
|
||||||
break;
|
|
||||||
case "commercial":
|
|
||||||
mat = _buildingSettings.CommercialBuildingsMat;
|
|
||||||
height = _buildingSettings.CommercialBuildingHeight;
|
|
||||||
break;
|
|
||||||
case "industrial":
|
|
||||||
mat = _buildingSettings.IndustrialBuildingsMat;
|
|
||||||
height = _buildingSettings.IndustrialBuildingHeight;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mat = _buildingSettings.DefaultBuildingMat;
|
|
||||||
height = _buildingSettings.DefaultBuildingHeight;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Mesh mesh = CreateExtrudedPolygonMesh(b.Outline, height);
|
|
||||||
meshFilter.mesh = mesh;
|
|
||||||
|
|
||||||
//TODO: material by type
|
|
||||||
// Použijeme barvu podle typu budovy
|
|
||||||
meshRenderer.material = mat;
|
|
||||||
|
|
||||||
// Přidání collideru pro interakci
|
|
||||||
building.AddComponent<MeshCollider>();
|
|
||||||
return building;
|
|
||||||
}
|
|
||||||
GameObject BuildPathwayMesh(MapPathway w)
|
|
||||||
{
|
|
||||||
var path = new GameObject($"Path_{w.Name ?? "Unknown"}");
|
|
||||||
|
|
||||||
// Použijeme LineRenderer pro jednoduchost
|
|
||||||
LineRenderer line = path.AddComponent<LineRenderer>();
|
|
||||||
float width;
|
|
||||||
Material mat;
|
|
||||||
|
|
||||||
switch (w.PathType)
|
|
||||||
{
|
|
||||||
case PathType.Footway:
|
|
||||||
mat = _pathwaySettings.FootwayMat;
|
|
||||||
width = _pathwaySettings.FootwayWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Path:
|
|
||||||
mat = _pathwaySettings.PathMat;
|
|
||||||
width = _pathwaySettings.PathWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Steps:
|
|
||||||
mat = _pathwaySettings.StepsMat;
|
|
||||||
width = _pathwaySettings.PathWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Cycleway:
|
|
||||||
mat = _pathwaySettings.CyclewayMat;
|
|
||||||
width = _pathwaySettings.CyclewayWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Pedestrian:
|
|
||||||
mat = _pathwaySettings.PedestrianMat;
|
|
||||||
width = _pathwaySettings.PedestrianWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Road:
|
|
||||||
mat = _pathwaySettings.RoadMat;
|
|
||||||
width = _pathwaySettings.RoadWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Service:
|
|
||||||
mat = _pathwaySettings.ServiceMat;
|
|
||||||
width = _pathwaySettings.ServiceWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Residential:
|
|
||||||
mat = _pathwaySettings.ResidentialMat;
|
|
||||||
width = _pathwaySettings.ResidentialWidth;
|
|
||||||
break;
|
|
||||||
case PathType.Track:
|
|
||||||
mat = _pathwaySettings.TrackMat;
|
|
||||||
width = _pathwaySettings.TrackWidth;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mat = _pathwaySettings.DefaultMat;
|
|
||||||
width = _pathwaySettings.DefaultWidth;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.material = mat;
|
|
||||||
line.widthMultiplier = width;
|
|
||||||
|
|
||||||
// Nastavení bodů cesty
|
|
||||||
line.positionCount = w.Points.Count;
|
|
||||||
for (int i = 0; i < w.Points.Count; i++)
|
|
||||||
{
|
|
||||||
Vector3 pos = w.Points[i].ToLocalVector3(_gameClient.CurrentLobbyState.MapData.Center);
|
|
||||||
pos.y = 0.1f; // Mírně nad zemí
|
|
||||||
line.SetPosition(i, pos);
|
|
||||||
}
|
|
||||||
return path;
|
|
||||||
}
|
|
||||||
GameObject BuildAreaMesh(MapArea a)
|
|
||||||
{
|
|
||||||
var area = new GameObject($"Area_{a.Name ?? "Unknown"}");
|
|
||||||
|
|
||||||
MeshFilter meshFilter = area.AddComponent<MeshFilter>();
|
|
||||||
MeshRenderer meshRenderer = area.AddComponent<MeshRenderer>();
|
|
||||||
|
|
||||||
// Vytvoření plochého mesh
|
|
||||||
Mesh mesh = CreateFlatPolygonMesh(a.Outline);
|
|
||||||
meshFilter.mesh = mesh;
|
|
||||||
|
|
||||||
|
|
||||||
Material mat;
|
|
||||||
switch (a.AreaType)
|
|
||||||
{
|
|
||||||
case MapAreaType.Park:
|
|
||||||
mat = _areaSettings.ParkMat;
|
|
||||||
break;
|
|
||||||
case MapAreaType.Garden:
|
|
||||||
mat = _areaSettings.GardenMat;
|
|
||||||
break;
|
|
||||||
case MapAreaType.Playground:
|
|
||||||
mat = _areaSettings.PlaygroundMat;
|
|
||||||
break;
|
|
||||||
case MapAreaType.Forest:
|
|
||||||
mat = _areaSettings.ForestMat;
|
|
||||||
break;
|
|
||||||
case MapAreaType.Grass:
|
|
||||||
mat = _areaSettings.GrassMat;
|
|
||||||
break;
|
|
||||||
case MapAreaType.Water:
|
|
||||||
mat = _areaSettings.WaterMat;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mat = _areaSettings.DefaultMat;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
meshRenderer.material = mat;
|
|
||||||
|
|
||||||
area.transform.position = new Vector3(0, 0.05f, 0); // Těsně nad zemí
|
|
||||||
|
|
||||||
return area;
|
|
||||||
}
|
|
||||||
//TODO: POIs
|
|
||||||
#endregion
|
|
||||||
#region Polygon Utils
|
|
||||||
private Vector3 CalculatePolygonCenter(List<Position> points)
|
|
||||||
{
|
|
||||||
Vector3 center = Vector3.zero;
|
|
||||||
foreach (var point in points)
|
|
||||||
{
|
|
||||||
center += point.ToLocalVector3(_gameClient.CurrentLobbyState.MapData.Center);
|
|
||||||
}
|
|
||||||
return center / points.Count;
|
|
||||||
}
|
|
||||||
private Mesh CreateExtrudedPolygonMesh(List<Position> outline, float height)
|
|
||||||
{
|
|
||||||
Mesh mesh = new Mesh();
|
|
||||||
|
|
||||||
int vertexCount = outline.Count;
|
|
||||||
|
|
||||||
// Vertices - spodní a horní podstava
|
|
||||||
Vector3[] vertices = new Vector3[vertexCount * 2];
|
|
||||||
Vector3 center = CalculatePolygonCenter(outline);
|
|
||||||
|
|
||||||
for (int i = 0; i < vertexCount; i++)
|
|
||||||
{
|
|
||||||
Vector3 pos = outline[i].ToLocalVector3(_gameClient.CurrentLobbyState.MapData.Center) - center;
|
|
||||||
vertices[i] = pos; // Spodní
|
|
||||||
vertices[i + vertexCount] = pos + Vector3.up * height; // Horní
|
|
||||||
}
|
|
||||||
|
|
||||||
// Triangles - jen boční stěny pro jednoduchost
|
|
||||||
List<int> triangles = new List<int>();
|
|
||||||
|
|
||||||
for (int i = 0; i < vertexCount; i++)
|
|
||||||
{
|
|
||||||
int next = (i + 1) % vertexCount;
|
|
||||||
|
|
||||||
// Boční stěna - dva trojúhelníky
|
|
||||||
triangles.Add(i);
|
|
||||||
triangles.Add(i + vertexCount);
|
|
||||||
triangles.Add(next);
|
|
||||||
|
|
||||||
triangles.Add(next);
|
|
||||||
triangles.Add(i + vertexCount);
|
|
||||||
triangles.Add(next + vertexCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Horní podstava - zjednodušená triangulace (fan)
|
|
||||||
if (vertexCount >= 3)
|
|
||||||
{
|
|
||||||
for (int i = 1; i < vertexCount - 1; i++)
|
|
||||||
{
|
|
||||||
triangles.Add(vertexCount); // Střed (první bod horní)
|
|
||||||
triangles.Add(vertexCount + i);
|
|
||||||
triangles.Add(vertexCount + i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh.vertices = vertices;
|
|
||||||
mesh.triangles = triangles.ToArray();
|
|
||||||
mesh.RecalculateNormals();
|
|
||||||
mesh.RecalculateBounds();
|
|
||||||
|
|
||||||
return mesh;
|
|
||||||
}
|
|
||||||
private Mesh CreateFlatPolygonMesh(List<Position> outline)
|
|
||||||
{
|
|
||||||
Mesh mesh = new Mesh();
|
|
||||||
|
|
||||||
int vertexCount = outline.Count;
|
|
||||||
Vector3[] vertices = new Vector3[vertexCount];
|
|
||||||
Vector3 center = CalculatePolygonCenter(outline);
|
|
||||||
|
|
||||||
for (int i = 0; i < vertexCount; i++)
|
|
||||||
{
|
|
||||||
vertices[i] = outline[i].ToLocalVector3(_gameClient.CurrentLobbyState.MapData.Center) - center;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Triangulace - fan pattern
|
|
||||||
List<int> triangles = new List<int>();
|
|
||||||
if (vertexCount >= 3)
|
|
||||||
{
|
|
||||||
for (int i = 1; i < vertexCount - 1; i++)
|
|
||||||
{
|
|
||||||
triangles.Add(0);
|
|
||||||
triangles.Add(i);
|
|
||||||
triangles.Add(i + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mesh.vertices = vertices;
|
|
||||||
mesh.triangles = triangles.ToArray();
|
|
||||||
mesh.RecalculateNormals();
|
|
||||||
|
|
||||||
return mesh;
|
|
||||||
}
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 71870ee18b89dd7438e5362ff9e02a3b
|
|
||||||
@@ -1,162 +0,0 @@
|
|||||||
using GeoSus.Client;
|
|
||||||
using System.Collections;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using UnityEngine;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Subsystems;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace Subsystems
|
|
||||||
{
|
|
||||||
public class GameManager_Network
|
|
||||||
{
|
|
||||||
private const string _serverAddress = "geosus.honzuvkod.dev";
|
|
||||||
private const int _serverPort = 7777;
|
|
||||||
private GameClient _gameClient;
|
|
||||||
private GameManager_Map _mapSubsystem;
|
|
||||||
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.EventType)
|
|
||||||
{
|
|
||||||
case "PlayerJoined":
|
|
||||||
Debug.Log($"Player {gameEvent.GetPayload<PlayerJoinedPayload>().DisplayName} joined");
|
|
||||||
break;
|
|
||||||
case "PlayerLeft":
|
|
||||||
Debug.Log($"Player {gameEvent.GetPayload<PlayerLeftPayload>()} left");
|
|
||||||
break;
|
|
||||||
case "GameStarting":
|
|
||||||
Debug.Log("Game is starting!");
|
|
||||||
break;
|
|
||||||
case "GameStarted":
|
|
||||||
Debug.Log("Game started");
|
|
||||||
break;
|
|
||||||
case "MapDataReady":
|
|
||||||
Debug.Log("Map data ready");
|
|
||||||
break;
|
|
||||||
case "PlayerMapDataReceived":
|
|
||||||
Debug.Log("Player map data recieved");
|
|
||||||
break;
|
|
||||||
case "MapDataError":
|
|
||||||
Debug.Log("Received MapData server error");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Debug.Log("Received GameEvent of type: " + gameEvent.EventType);
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
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();
|
|
||||||
}
|
|
||||||
public void StartGame()
|
|
||||||
{
|
|
||||||
_gameClient.StartGame();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 989e9292fe24c2a4ba95ceae191dd330
|
|
||||||
@@ -1,71 +0,0 @@
|
|||||||
using UnityEngine;
|
|
||||||
using Subsystems;
|
|
||||||
using GeoSus.Client;
|
|
||||||
using System.ComponentModel;
|
|
||||||
using System.Threading;
|
|
||||||
|
|
||||||
namespace Subsystems
|
|
||||||
{
|
|
||||||
public class GameManager_UI
|
|
||||||
{
|
|
||||||
private GameClient _gameClient;
|
|
||||||
private Canvas _CreateJoinLobby;
|
|
||||||
private Canvas _InLobby;
|
|
||||||
private Canvas _LoadingScreen;
|
|
||||||
private Canvas _GameScreen;
|
|
||||||
public GameManager_UI(GameClient gameClient, Canvas CreateJoinLobby, Canvas InLobby, Canvas LoadingScreen, Canvas GameScreen)
|
|
||||||
{
|
|
||||||
_gameClient = gameClient;
|
|
||||||
_CreateJoinLobby = CreateJoinLobby;
|
|
||||||
_LoadingScreen = LoadingScreen;
|
|
||||||
_GameScreen = GameScreen;
|
|
||||||
_InLobby = InLobby;
|
|
||||||
_CreateJoinLobby.enabled = true;
|
|
||||||
_InLobby.enabled = false;
|
|
||||||
_GameScreen.enabled = false;
|
|
||||||
_LoadingScreen.enabled = false;
|
|
||||||
}
|
|
||||||
public void UpdateLobbyUI()
|
|
||||||
{
|
|
||||||
if (_gameClient.CurrentLobbyState == null)
|
|
||||||
{
|
|
||||||
_CreateJoinLobby.enabled = true;
|
|
||||||
_InLobby.enabled = false;
|
|
||||||
_GameScreen.enabled = false;
|
|
||||||
_LoadingScreen.enabled = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (_gameClient.CurrentLobbyState.Phase == GamePhase.Loading)
|
|
||||||
{
|
|
||||||
_CreateJoinLobby.enabled = false;
|
|
||||||
_InLobby.enabled = false;
|
|
||||||
_GameScreen.enabled = false;
|
|
||||||
_LoadingScreen.enabled = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (_gameClient.CurrentLobbyState.Phase == GamePhase.Lobby)
|
|
||||||
{
|
|
||||||
_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;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else if (_gameClient.CurrentLobbyState.Phase == GamePhase.Playing)
|
|
||||||
{
|
|
||||||
_CreateJoinLobby.enabled = false;
|
|
||||||
_InLobby.enabled = false;
|
|
||||||
_GameScreen.enabled = true;
|
|
||||||
_LoadingScreen.enabled = false;
|
|
||||||
_GameScreen.transform.Find("Role").GetComponent<TMPro.TMP_Text>().text = _gameClient.MyRole.ToString() ;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: cbe0afd6cfb57b44781533cfa4ce4196
|
|
||||||
@@ -4,50 +4,18 @@ using UnityEngine;
|
|||||||
|
|
||||||
public enum TaskType
|
public enum TaskType
|
||||||
{
|
{
|
||||||
Task //TODO: Typy úkolù
|
Task
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface ITask
|
public interface ITask
|
||||||
{
|
{
|
||||||
public string TaskID { get; } // Unikátní ID úkolu pro server
|
public string TaskID { get; set; } // Unikátní ID úkolu pro server
|
||||||
public TaskType TaskType { get; } // Typ úkolu
|
public TaskType TaskType { get; set; } // Typ úkolu
|
||||||
public string TaskName { get; } // Viditelný název úkolu
|
public string TaskName { get; set; } // Viditelný název úkolu
|
||||||
public (double, double) TaskLocation { get; } // Polohy na mapì
|
public (double, double) TaskLocation { get; set; } // Poloha na mapě
|
||||||
public bool IsCompleted { get; } // Stav dokonèení úkolu
|
public bool IsCompleted { get; } // Stav dokončení úkolu
|
||||||
|
|
||||||
void Initialize(Action<ITask> onCompleted); // Vytvoøení tasku + naètení postupu
|
|
||||||
void ExitTask(Action<ITask> onExit); // Pøi opuštìní úkolu poslat hotovo / uložit postup / reset
|
|
||||||
void Complete(); // Oznaèit úkol jako dokonèený, poslat na server a zavøít
|
|
||||||
|
|
||||||
|
void Initialize(Action<ITask> onCompleted); // Vytvoření tasku
|
||||||
|
void ExitTask(Action<ITask> onExit); // Při opuštění úkolu
|
||||||
|
void Complete(); // Označit úkol jako dokončený
|
||||||
}
|
}
|
||||||
/* Ukázoková implementace ITask
|
|
||||||
public class Wires : ITask{
|
|
||||||
public string TaskID { get; set; } // Unikátní ID úkolu pro server
|
|
||||||
public TaskType TaskType { get; set; } // Typ úkolu
|
|
||||||
public string TaskName { get; set; } // Viditelný název úkolu
|
|
||||||
public (double, double) TaskLocation { get; set; } // Poloha na mapì
|
|
||||||
public bool IsCompleted { get; private set; } // Stav dokonèení úkolu
|
|
||||||
private Action<ITask> _onCompleted;
|
|
||||||
|
|
||||||
public void Initialize(Action<ITask> onCompleted) // Vytvoøení tasku
|
|
||||||
{
|
|
||||||
IsCompleted = false;
|
|
||||||
_onCompleted = onCompleted;
|
|
||||||
}
|
|
||||||
public void ExitTask(Action<ITask> onExit) //Zavøení tasku
|
|
||||||
{
|
|
||||||
onExit?.Invoke(this);
|
|
||||||
}
|
|
||||||
public void Complete() // Dokonèení tasku a zavøení
|
|
||||||
{
|
|
||||||
IsCompleted = true;
|
|
||||||
_onCompleted?.Invoke(this);
|
|
||||||
ExitTask(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
%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: TestMaterial
|
|
||||||
m_Shader: {fileID: 10753, 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:
|
|
||||||
- _AlphaTex:
|
|
||||||
m_Texture: {fileID: 0}
|
|
||||||
m_Scale: {x: 1, y: 1}
|
|
||||||
m_Offset: {x: 0, y: 0}
|
|
||||||
- _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:
|
|
||||||
- PixelSnap: 0
|
|
||||||
- _BumpScale: 1
|
|
||||||
- _Cutoff: 0.5
|
|
||||||
- _DetailNormalMapScale: 1
|
|
||||||
- _DstBlend: 0
|
|
||||||
- _EnableExternalAlpha: 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: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
|
|
||||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
|
||||||
m_BuildTextureStacks: []
|
|
||||||
m_AllowLocking: 1
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 6744524496c8e1549882277283c132cc
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 1bc3c07f160332843b2a60af3513f7f6
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 75857465ac3a7394db0ff208711dadc4
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
%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 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 299795d658d037841b1552f783d462c3
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 2167308ece2e6664fa472e3dff700350
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
%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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 4cf6d1d65bc4af24fa762f6801fcc7c4
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 404 KiB |
@@ -1,143 +0,0 @@
|
|||||||
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:
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
%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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 4d595312cdcdd094cbe411227603ceea
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 8400000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
@@ -1,110 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 0e125acbe6e192344a3f1c6d4a54f131
|
|
||||||
ModelImporter:
|
|
||||||
serializedVersion: 24200
|
|
||||||
internalIDToNameTable: []
|
|
||||||
externalObjects: {}
|
|
||||||
materials:
|
|
||||||
materialImportMode: 2
|
|
||||||
materialName: 0
|
|
||||||
materialSearch: 1
|
|
||||||
materialLocation: 1
|
|
||||||
animations:
|
|
||||||
legacyGenerateAnimations: 4
|
|
||||||
bakeSimulation: 0
|
|
||||||
resampleCurves: 1
|
|
||||||
optimizeGameObjects: 0
|
|
||||||
removeConstantScaleCurves: 0
|
|
||||||
motionNodeName:
|
|
||||||
animationImportErrors:
|
|
||||||
animationImportWarnings:
|
|
||||||
animationRetargetingWarnings:
|
|
||||||
animationDoRetargetingWarnings: 0
|
|
||||||
importAnimatedCustomProperties: 0
|
|
||||||
importConstraints: 0
|
|
||||||
animationCompression: 1
|
|
||||||
animationRotationError: 0.5
|
|
||||||
animationPositionError: 0.5
|
|
||||||
animationScaleError: 0.5
|
|
||||||
animationWrapMode: 0
|
|
||||||
extraExposedTransformPaths: []
|
|
||||||
extraUserProperties: []
|
|
||||||
clipAnimations: []
|
|
||||||
isReadable: 0
|
|
||||||
meshes:
|
|
||||||
lODScreenPercentages: []
|
|
||||||
globalScale: 1
|
|
||||||
meshCompression: 0
|
|
||||||
addColliders: 0
|
|
||||||
useSRGBMaterialColor: 1
|
|
||||||
sortHierarchyByName: 1
|
|
||||||
importPhysicalCameras: 1
|
|
||||||
importVisibility: 1
|
|
||||||
importBlendShapes: 1
|
|
||||||
importCameras: 1
|
|
||||||
importLights: 1
|
|
||||||
nodeNameCollisionStrategy: 1
|
|
||||||
fileIdsGeneration: 2
|
|
||||||
swapUVChannels: 0
|
|
||||||
generateSecondaryUV: 0
|
|
||||||
useFileUnits: 1
|
|
||||||
keepQuads: 0
|
|
||||||
weldVertices: 1
|
|
||||||
bakeAxisConversion: 0
|
|
||||||
preserveHierarchy: 0
|
|
||||||
skinWeightsMode: 0
|
|
||||||
maxBonesPerVertex: 4
|
|
||||||
minBoneWeight: 0.001
|
|
||||||
optimizeBones: 1
|
|
||||||
generateMeshLods: 0
|
|
||||||
meshLodGenerationFlags: 0
|
|
||||||
maximumMeshLod: -1
|
|
||||||
meshOptimizationFlags: -1
|
|
||||||
indexFormat: 0
|
|
||||||
secondaryUVAngleDistortion: 8
|
|
||||||
secondaryUVAreaDistortion: 15.000001
|
|
||||||
secondaryUVHardAngle: 88
|
|
||||||
secondaryUVMarginMethod: 1
|
|
||||||
secondaryUVMinLightmapResolution: 40
|
|
||||||
secondaryUVMinObjectScale: 1
|
|
||||||
secondaryUVPackMargin: 4
|
|
||||||
useFileScale: 1
|
|
||||||
strictVertexDataChecks: 0
|
|
||||||
tangentSpace:
|
|
||||||
normalSmoothAngle: 60
|
|
||||||
normalImportMode: 0
|
|
||||||
tangentImportMode: 3
|
|
||||||
normalCalculationMode: 4
|
|
||||||
legacyComputeAllNormalsFromSmoothingGroupsWhenMeshHasBlendShapes: 0
|
|
||||||
blendShapeNormalImportMode: 1
|
|
||||||
normalSmoothingSource: 0
|
|
||||||
referencedClips: []
|
|
||||||
importAnimation: 1
|
|
||||||
humanDescription:
|
|
||||||
serializedVersion: 3
|
|
||||||
human: []
|
|
||||||
skeleton: []
|
|
||||||
armTwist: 0.5
|
|
||||||
foreArmTwist: 0.5
|
|
||||||
upperLegTwist: 0.5
|
|
||||||
legTwist: 0.5
|
|
||||||
armStretch: 0.05
|
|
||||||
legStretch: 0.05
|
|
||||||
feetSpacing: 0
|
|
||||||
globalScale: 1
|
|
||||||
rootMotionBoneName:
|
|
||||||
hasTranslationDoF: 0
|
|
||||||
hasExtraRoot: 0
|
|
||||||
skeletonHasParents: 1
|
|
||||||
lastHumanDescriptionAvatarSource: {instanceID: 0}
|
|
||||||
autoGenerateAvatarMappingIfUnspecified: 1
|
|
||||||
animationType: 2
|
|
||||||
humanoidOversampling: 1
|
|
||||||
avatarSetup: 0
|
|
||||||
addHumanoidExtraRootOnlyWhenUsingAvatar: 1
|
|
||||||
importBlendShapeDeformPercent: 1
|
|
||||||
remapMaterialsIfMaterialImportModeIsNone: 0
|
|
||||||
additionalBone: 0
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
%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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: e00f6447ca0dc7646b73cb387d282a47
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 579723ff3377eaf4a9e50b2d20bbb490
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
%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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: b8ea26def9472484b87d08513faa2756
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,84 +0,0 @@
|
|||||||
%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
|
|
||||||
34
Assets/Readme.asset
Normal file
34
Assets/Readme.asset
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
%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
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 14e7660f277f5414ab8b483f12ca6e3a
|
guid: 2651bd22cf5764e4eb358f11641edca2
|
||||||
NativeFormatImporter:
|
NativeFormatImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
mainObjectFileID: 0
|
mainObjectFileID: 0
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 5e17b3a6c19f5404d8d097400a844a60
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 55b6abf6106d3da4d9a6d0550a804f3b
|
guid: ae701dd46572ae44faa1c08754c677a1
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 99349b837685d91408e5eb5bac237678
|
guid: fbd0ba17ed8002141b6b82c678cd3baf
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 42774ddf02ffd1747898d12625c667b0
|
guid: 38f8393f8cca8f24bb21ca2ab3a28acc
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: 60b609405d1182342a835866a25ce8ae
|
guid: 8356cb86749a3674299ae725d58c8012
|
||||||
DefaultImporter:
|
DefaultImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
userData:
|
userData:
|
||||||
1961
Assets/Scenes/Kabely/MiniGame-Kabely V5.unity
Normal file
1961
Assets/Scenes/Kabely/MiniGame-Kabely V5.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Kabely/MiniGame-Kabely V5.unity.meta
Normal file
7
Assets/Scenes/Kabely/MiniGame-Kabely V5.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: a007c35d1a63dc3418a3afe3c7407450
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1961
Assets/Scenes/Kabely/MiniGame-Kabely V6.unity
Normal file
1961
Assets/Scenes/Kabely/MiniGame-Kabely V6.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Kabely/MiniGame-Kabely V6.unity.meta
Normal file
7
Assets/Scenes/Kabely/MiniGame-Kabely V6.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8b4a331c3bc0f6445a0797f99cc38604
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1961
Assets/Scenes/Kabely/MiniGame-Kabely V7.unity
Normal file
1961
Assets/Scenes/Kabely/MiniGame-Kabely V7.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Kabely/MiniGame-Kabely V7.unity.meta
Normal file
7
Assets/Scenes/Kabely/MiniGame-Kabely V7.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 87c5ee97c7d1da345978bf431113faeb
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1961
Assets/Scenes/Kabely/MiniGame-Kabely V8.unity
Normal file
1961
Assets/Scenes/Kabely/MiniGame-Kabely V8.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Kabely/MiniGame-Kabely V8.unity.meta
Normal file
7
Assets/Scenes/Kabely/MiniGame-Kabely V8.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 17fc65d1a95feae42b8815a07ea2ffef
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
1961
Assets/Scenes/Kabely/MiniGame-Kabely V9.unity
Normal file
1961
Assets/Scenes/Kabely/MiniGame-Kabely V9.unity
Normal file
File diff suppressed because it is too large
Load Diff
7
Assets/Scenes/Kabely/MiniGame-Kabely V9.unity.meta
Normal file
7
Assets/Scenes/Kabely/MiniGame-Kabely V9.unity.meta
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 3f2ca619b4f5384489cf03c1dd13a701
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 0d2bf6fbc15c94c4db51c326dbaa84ee
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 3347745980e97824f9dda5b6043b57e7
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
@@ -1,23 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: fa27202025a24b6418e644af57608959
|
|
||||||
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:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 6b025445e5a6de74780d752e5354a0a9
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
File diff suppressed because one or more lines are too long
@@ -1,143 +0,0 @@
|
|||||||
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:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 0cff73c6845b7cb40877239c2a7e25fc
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
%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
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 628af2744593aaf4fbadc7aec37b8b41
|
|
||||||
NativeFormatImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
mainObjectFileID: 2100000
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
fileFormatVersion: 2
|
|
||||||
guid: 52bdfdf1d7e2c6c40a8cdd507da420a8
|
|
||||||
folderAsset: yes
|
|
||||||
DefaultImporter:
|
|
||||||
externalObjects: {}
|
|
||||||
userData:
|
|
||||||
assetBundleName:
|
|
||||||
assetBundleVariant:
|
|
||||||
Binary file not shown.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
@@ -1,21 +0,0 @@
|
|||||||
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.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user