using System; using System.Collections; using System.Collections.Generic; using System.Runtime.Serialization; using UnityEngine; /// /// Representation of 3D vectors and points. /// namespace UnityLibrary { [Serializable] public struct Vector3Serializable : ISerializable { #region Parametres /// /// X component of the vector. /// public float x; /// /// Y component of the vector. /// public float y; /// /// Z component of the vector. /// public float z; #endregion #region Constructors /// /// Initializes a new instance of the struct. /// /// Vector. public Vector3Serializable(Vector2 vector) : this(vector.x, vector.y) { } /// /// Initializes a new instance of the struct. /// /// Vector. public Vector3Serializable(Vector3 vector) : this(vector.x, vector.y, vector.z) { } /// /// Initializes a new instance of the struct. /// /// Vector. public Vector3Serializable(Vector4 vector) : this(vector.x, vector.y, vector.z) { } /// /// Initializes a new instance of the struct. /// /// The x coordinate. /// The y coordinate. public Vector3Serializable(float x, float y) : this(x, y, 0f) { } /// /// Initializes a new instance of the struct. /// /// The x coordinate. /// The y coordinate. /// The z coordinate. public Vector3Serializable(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } #endregion #region Methods public override bool Equals(object obj) { if (obj is Vector3Serializable || obj is Vector3) { Vector3Serializable vector = (Vector3Serializable)obj; return this.x == vector.x && this.y == vector.y && this.z == vector.z; } return false; } public override int GetHashCode() { return this.x.GetHashCode() ^ this.y.GetHashCode() << 2 ^ this.z.GetHashCode() >> 2; } public override string ToString() { return string.Format("({0}, {1}, {2})", this.x, this.y, this.z); } #endregion #region Operators Overload public static implicit operator Vector3Serializable(Vector2 vector) { return new Vector3Serializable(vector); } public static implicit operator Vector2(Vector3Serializable vector) { return new Vector2(vector.x, vector.y); } public static implicit operator Vector3Serializable(Vector3 vector) { return new Vector3Serializable(vector); } public static implicit operator Vector3(Vector3Serializable vector) { return new Vector3(vector.x, vector.y, vector.z); } public static implicit operator Vector3Serializable(Vector4 vector) { return new Vector3Serializable(vector); } public static implicit operator Vector4(Vector3Serializable vector) { return new Vector4(vector.x, vector.y, vector.z); } public static implicit operator Vector3Serializable(Vector2Serializable vector) { return new Vector3Serializable((Vector3)vector); } public static implicit operator Vector2Serializable(Vector3Serializable vector) { return new Vector2Serializable((Vector3)vector); } public static implicit operator Vector3Serializable(Vector4Serializable vector) { return new Vector3Serializable((Vector3)vector); } public static implicit operator Vector4Serializable(Vector3Serializable vector) { return new Vector4Serializable((Vector3)vector); } #endregion #region ISerializable implementation public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("x", this.x, typeof(float)); info.AddValue("y", this.y, typeof(float)); info.AddValue("z", this.z, typeof(float)); } #endregion } }