// Magica Cloth 2. // Copyright (c) 2023 MagicaSoft. // https://magicasoft.jp using UnityEngine; namespace MagicaCloth2 { /// /// MagicaCloth main component. /// [AddComponentMenu("MagicaCloth2/MagicaCloth")] [HelpURL("https://magicasoft.jp/en/mc2_magicaclothcomponent/")] public partial class MagicaCloth : ClothBehaviour, IValid { /// /// Serialize data (1). /// Basic parameters. /// Import/export target. /// Can be rewritten at runtime. /// [SerializeField] private ClothSerializeData serializeData = new ClothSerializeData(); public ClothSerializeData SerializeData => serializeData; /// /// Serialize data (2). /// Hidden data that cannot be rewritten at runtime /// [SerializeField] internal ClothSerializeData2 serializeData2 = new ClothSerializeData2(); #if UNITY_EDITOR /// /// Gizmo display specification when editing. /// [SerializeField] private GizmoSerializeData gizmoSerializeData = new GizmoSerializeData(); public GizmoSerializeData GizmoSerializeData => gizmoSerializeData; #endif /// /// General processing. /// private ClothProcess process = new ClothProcess(); public ClothProcess Process { get { process.cloth = this; return process; } } /// /// Cloth component transform. /// Proxy meshes and selection data are managed in this space. /// public Transform ClothTransform => transform; /// /// Synchronization target. /// public MagicaCloth SyncCloth => SerializeData.IsBoneSpring() ? null : SerializeData.selfCollisionConstraint.GetSyncPartner(); /// /// Check if the cloth component is in a valid state. /// クロスコンポーネントが有効な状態か確認します。 /// /// public bool IsValid() { return MagicaManager.IsPlaying() && Process.IsValid() && Process.TeamId > 0; } //========================================================================================= private void Reset() { #if UNITY_EDITOR // Automatically generate pre-build ID serializeData2.preBuildData.buildId = PreBuildSerializeData.GenerateBuildID(); #endif } private void OnValidate() { Process.DataUpdate(); } private void Awake() { Process.Init(); // If Awake() is called, OnDestroy() will also be called, so remove it from monitoring. MagicaManager.Team.RemoveMonitoringProcess(Process); } private void OnEnable() { Process.StartUse(); } private void OnDisable() { Process.EndUse(); } void Start() { Process.AutoBuild(); } private void OnDestroy() { Process.Dispose(); } /// /// Hash code for checking changes when editing. /// /// public override int GetMagicaHashCode() { int hash = SerializeData.GetHashCode() + serializeData2.GetHashCode(); hash += isActiveAndEnabled ? GetInstanceID() : 0; // component active. return hash; } } }