mirror of
				https://github.com/DerTyp7/defrain-shooter-unity.git
				synced 2025-10-31 13:37:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Runtime.InteropServices;
 | |
| using System.Security.Cryptography;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace Mirror
 | |
| {
 | |
|     // Handles network messages on client and server
 | |
|     public delegate void NetworkMessageDelegate(NetworkConnection conn, NetworkReader reader, int channelId);
 | |
| 
 | |
|     // Handles requests to spawn objects on the client
 | |
|     public delegate GameObject SpawnDelegate(Vector3 position, Guid assetId);
 | |
| 
 | |
|     public delegate GameObject SpawnHandlerDelegate(SpawnMessage msg);
 | |
| 
 | |
|     // Handles requests to unspawn objects on the client
 | |
|     public delegate void UnSpawnDelegate(GameObject spawned);
 | |
| 
 | |
|     // invoke type for Cmd/Rpc
 | |
|     public enum MirrorInvokeType
 | |
|     {
 | |
|         Command,
 | |
|         ClientRpc
 | |
|     }
 | |
| 
 | |
|     // channels are const ints instead of an enum so people can add their own
 | |
|     // channels (can't extend an enum otherwise).
 | |
|     //
 | |
|     // note that Mirror is slowly moving towards quake style networking which
 | |
|     // will only require reliable for handshake, and unreliable for the rest.
 | |
|     // so eventually we can change this to an Enum and transports shouldn't
 | |
|     // add custom channels anymore.
 | |
|     public static class Channels
 | |
|     {
 | |
|         public const int Reliable = 0;      // ordered
 | |
|         public const int Unreliable = 1;    // unordered
 | |
|     }
 | |
| 
 | |
|     // -- helpers for float conversion without allocations --
 | |
|     [StructLayout(LayoutKind.Explicit)]
 | |
|     internal struct UIntFloat
 | |
|     {
 | |
|         [FieldOffset(0)]
 | |
|         public float floatValue;
 | |
| 
 | |
|         [FieldOffset(0)]
 | |
|         public uint intValue;
 | |
|     }
 | |
| 
 | |
|     [StructLayout(LayoutKind.Explicit)]
 | |
|     internal struct UIntDouble
 | |
|     {
 | |
|         [FieldOffset(0)]
 | |
|         public double doubleValue;
 | |
| 
 | |
|         [FieldOffset(0)]
 | |
|         public ulong longValue;
 | |
|     }
 | |
| 
 | |
|     [StructLayout(LayoutKind.Explicit)]
 | |
|     internal struct UIntDecimal
 | |
|     {
 | |
|         [FieldOffset(0)]
 | |
|         public ulong longValue1;
 | |
| 
 | |
|         [FieldOffset(8)]
 | |
|         public ulong longValue2;
 | |
| 
 | |
|         [FieldOffset(0)]
 | |
|         public decimal decimalValue;
 | |
|     }
 | |
| 
 | |
|     public static class Utils
 | |
|     {
 | |
|         public static uint GetTrueRandomUInt()
 | |
|         {
 | |
|             // use Crypto RNG to avoid having time based duplicates
 | |
|             using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
 | |
|             {
 | |
|                 byte[] bytes = new byte[4];
 | |
|                 rng.GetBytes(bytes);
 | |
|                 return BitConverter.ToUInt32(bytes, 0);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public static bool IsPrefab(GameObject obj)
 | |
|         {
 | |
| #if UNITY_EDITOR
 | |
|             return UnityEditor.PrefabUtility.IsPartOfPrefabAsset(obj);
 | |
| #else
 | |
|             return false;
 | |
| #endif
 | |
|         }
 | |
| 
 | |
|         public static bool IsSceneObjectWithPrefabParent(GameObject gameObject, out GameObject prefab)
 | |
|         {
 | |
|             prefab = null;
 | |
| 
 | |
| #if UNITY_EDITOR
 | |
|             if (!UnityEditor.PrefabUtility.IsPartOfPrefabInstance(gameObject))
 | |
|             {
 | |
|                 return false;
 | |
|             }
 | |
|             prefab = UnityEditor.PrefabUtility.GetCorrespondingObjectFromSource(gameObject);
 | |
| #endif
 | |
| 
 | |
|             if (prefab == null)
 | |
|             {
 | |
|                 Debug.LogError($"Failed to find prefab parent for scene object [name:{gameObject.name}]");
 | |
|                 return false;
 | |
|             }
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         // is a 2D point in screen? (from ummorpg)
 | |
|         // (if width = 1024, then indices from 0..1023 are valid (=1024 indices)
 | |
|         public static bool IsPointInScreen(Vector2 point) =>
 | |
|             0 <= point.x && point.x < Screen.width &&
 | |
|             0 <= point.y && point.y < Screen.height;
 | |
|     }
 | |
| }
 | 
