// ---------------------------------------------------------------------------- // // PhotonNetwork Framework for Unity - Copyright (C) 2018 Exit Games GmbH // // // Sets up support for Unity-specific types. Can be a blueprint how to register your own Custom Types for sending. // // developer@exitgames.com // ---------------------------------------------------------------------------- #if UNITY_4_7 || UNITY_5 || UNITY_5_3_OR_NEWER #define SUPPORTED_UNITY #endif #if SUPPORTED_UNITY namespace Photon.Realtime { using Photon.Realtime; using ExitGames.Client.Photon; using UnityEngine; using Debug = UnityEngine.Debug; /// /// Internally used class, containing de/serialization methods for various Unity-specific classes. /// Adding those to the Photon serialization protocol allows you to send them in events, etc. /// internal static class CustomTypesUnity { private const int SizeV2 = 2 * 4; private const int SizeV3 = 3 * 4; private const int SizeQuat = 4 * 4; /// Register de/serializer methods for Unity specific types. Makes the types usable in RaiseEvent and PUN. internal static void Register() { PhotonPeer.RegisterType(typeof(Vector2), (byte) 'W', SerializeVector2, DeserializeVector2); PhotonPeer.RegisterType(typeof(Vector3), (byte) 'V', SerializeVector3, DeserializeVector3); PhotonPeer.RegisterType(typeof(Quaternion), (byte) 'Q', SerializeQuaternion, DeserializeQuaternion); } #region Custom De/Serializer Methods public static readonly byte[] memVector3 = new byte[SizeV3]; private static short SerializeVector3(StreamBuffer outStream, object customobject) { Vector3 vo = (Vector3) customobject; int index = 0; lock (memVector3) { byte[] bytes = memVector3; Protocol.Serialize(vo.x, bytes, ref index); Protocol.Serialize(vo.y, bytes, ref index); Protocol.Serialize(vo.z, bytes, ref index); outStream.Write(bytes, 0, SizeV3); } return SizeV3; } private static object DeserializeVector3(StreamBuffer inStream, short length) { Vector3 vo = new Vector3(); if (length != SizeV3) { return vo; } lock (memVector3) { inStream.Read(memVector3, 0, SizeV3); int index = 0; Protocol.Deserialize(out vo.x, memVector3, ref index); Protocol.Deserialize(out vo.y, memVector3, ref index); Protocol.Deserialize(out vo.z, memVector3, ref index); } return vo; } public static readonly byte[] memVector2 = new byte[SizeV2]; private static short SerializeVector2(StreamBuffer outStream, object customobject) { Vector2 vo = (Vector2) customobject; lock (memVector2) { byte[] bytes = memVector2; int index = 0; Protocol.Serialize(vo.x, bytes, ref index); Protocol.Serialize(vo.y, bytes, ref index); outStream.Write(bytes, 0, SizeV2); } return SizeV2; } private static object DeserializeVector2(StreamBuffer inStream, short length) { Vector2 vo = new Vector2(); if (length != SizeV2) { return vo; } lock (memVector2) { inStream.Read(memVector2, 0, SizeV2); int index = 0; Protocol.Deserialize(out vo.x, memVector2, ref index); Protocol.Deserialize(out vo.y, memVector2, ref index); } return vo; } public static readonly byte[] memQuarternion = new byte[SizeQuat]; private static short SerializeQuaternion(StreamBuffer outStream, object customobject) { Quaternion o = (Quaternion) customobject; lock (memQuarternion) { byte[] bytes = memQuarternion; int index = 0; Protocol.Serialize(o.w, bytes, ref index); Protocol.Serialize(o.x, bytes, ref index); Protocol.Serialize(o.y, bytes, ref index); Protocol.Serialize(o.z, bytes, ref index); outStream.Write(bytes, 0, SizeQuat); } return 4 * 4; } private static object DeserializeQuaternion(StreamBuffer inStream, short length) { Quaternion o = Quaternion.identity; if (length != SizeQuat) { return o; } lock (memQuarternion) { inStream.Read(memQuarternion, 0, SizeQuat); int index = 0; Protocol.Deserialize(out o.w, memQuarternion, ref index); Protocol.Deserialize(out o.x, memQuarternion, ref index); Protocol.Deserialize(out o.y, memQuarternion, ref index); Protocol.Deserialize(out o.z, memQuarternion, ref index); } return o; } #endregion } } #endif