void BaseClothDispose() { if (MagicaPhysicsManager.IsInstance() == false) { return; } // デフォーマとの状態の連動を解除 int dcount = GetDeformerCount(); for (int i = 0; i < dcount; i++) { var deformer = GetDeformer(i); if (deformer != null) { LinkDeformerStatus(deformer, false); } } if (Status.IsInitSuccess) { // 頂点無効化 SetUseVertex(false); // クロス破棄 // この中ですべてのコンストレイントとワーカーからチームのデータが自動削除される setup.ClothDispose(this); ClothDispose(); } }
//========================================================================================= /// <summary> /// ブレンド率更新 /// </summary> public void UpdateBlend() { if (MagicaPhysicsManager.IsInstance() == false) { return; } if (teamId <= 0) { return; } // ユーザーブレンド率 float blend = TeamData.UserBlendRatio; // 距離ブレンド率 blend *= setup.DistanceBlendRatio; // 変更チェック blend = Mathf.Clamp01(blend); if (blend != oldBlendRatio) { // チームデータへ反映 MagicaPhysicsManager.Instance.Team.SetBlendRatio(teamId, blend); // コンポーネント有効化判定 SetUserEnable(blend > 0.01f); oldBlendRatio = blend; } }
//========================================================================================= /// <summary> /// 使用デフォーマー設定 /// </summary> /// <param name="sw"></param> void SetUseMesh(bool sw) { if (MagicaPhysicsManager.IsInstance() == false) { return; } if (Status.IsInitSuccess == false) { return; } int dcount = GetDeformerCount(); for (int i = 0; i < dcount; i++) { var deformer = GetDeformer(i); if (deformer != null) { if (sw) { deformer.AddUseMesh(this); } else { deformer.RemoveUseMesh(this); } } } }
void MainInspector() { MagicaPhysicsManager scr = target as MagicaPhysicsManager; EditorGUILayout.Space(); EditorGUILayout.LabelField("Update", EditorStyles.boldLabel); using (new EditorGUI.IndentLevelScope()) { var prop = serializedObject.FindProperty("updateTime.updatePerSeccond"); EditorGUILayout.PropertyField(prop); var prop2 = serializedObject.FindProperty("updateTime.updateMode"); EditorGUILayout.PropertyField(prop2); // 以下は遅延実行時のみ if (scr.UpdateTime.IsDelay) { var prop3 = serializedObject.FindProperty("updateTime.futurePredictionRate"); EditorGUILayout.PropertyField(prop3); } Help1(); #if (UNITY_2018 || UNITY_2019_1 || UNITY_2019_2_1 || UNITY_2019_2_2 || UNITY_2019_2_3 || UNITY_2019_2_4 || UNITY_2019_2_5 || UNITY_2019_2_6 || UNITY_2019_2_7 || UNITY_2019_2_8 || UNITY_2019_2_9 || UNITY_2019_2_10 || UNITY_2019_2_11 || UNITY_2019_2_12 || UNITY_2019_2_13) var prop4 = serializedObject.FindProperty("updateTime.updateBoneScale"); //EditorGUILayout.PropertyField(prop4); //prop4.boolValue = EditorGUILayout.Toggle("Update Bone Scale (2019.2.13 or earlier)", prop4.boolValue); prop4.boolValue = EditorGUILayout.Toggle("Update Bone Scale", prop4.boolValue); Help2(); #endif } }
/// <summary> /// 実行状態から抜けた場合に呼ばれます /// </summary> protected override void OnInactive() { if (MagicaPhysicsManager.IsInstance()) { // チーム無効化 MagicaPhysicsManager.Instance.Team.SetEnable(teamId, false); } }
/// <summary> /// 破棄 /// </summary> public override void Dispose() { if (MagicaPhysicsManager.IsInstance()) { // メッシュ解除 MagicaPhysicsManager.Instance.Mesh.RemoveRenderMesh(MeshIndex); } base.Dispose(); }
/// <summary> /// 破棄 /// </summary> protected virtual void OnDispose() { if (MagicaPhysicsManager.IsInstance() == false) { return; } // パーティクルを破棄する RemoveParticle(); }
/// <summary> /// パーティクル無効化 /// </summary> protected void DisableParticle() { if (MagicaPhysicsManager.IsInstance()) { foreach (var teamId in particleDict.Keys) { DisableTeamParticle(teamId); } } }
/// <summary> /// 破棄 /// 通常はOnDestroy()で呼ぶ /// </summary> public virtual void Dispose() { // マネージャから削除 if (MagicaPhysicsManager.IsInstance()) { MagicaPhysicsManager.Instance.Mesh.RemoveMesh(this); } status.SetDispose(); }
/// <summary> /// 破棄 /// </summary> protected virtual void OnDispose() { if (MagicaPhysicsManager.IsInstance() == false) { return; } // 風を破棄する RemoveWind(); }
//========================================================================================= /// <summary> /// 風削除 /// </summary> protected void RemoveWind() { if (MagicaPhysicsManager.IsInstance()) { if (windId >= 0) { MagicaPhysicsManager.Instance.Wind.RemoveWind(windId); } } windId = -1; }
/// <summary> /// 管理するパーティクルを無効化する /// </summary> public void DisableParticle( System.Func <int, Transform> funcTarget, System.Func <int, float3> funcLpos, System.Func <int, quaternion> funcLrot ) { if (MagicaPhysicsManager.IsInstance()) { MagicaPhysicsManager.Instance.Particle.SetEnable(particleChunk, false, funcTarget, funcLpos, funcLrot); } }
/// <summary> /// チームデータが存在するか判定 /// </summary> /// <returns></returns> public bool IsValid() { if (MagicaPhysicsManager.IsInstance()) { return(MagicaPhysicsManager.Instance.Team.IsValid(teamId)); } else { return(false); } }
/// <summary> /// パーティクル削除 /// </summary> protected void RemoveParticle() { if (MagicaPhysicsManager.IsInstance()) { foreach (var teamId in particleDict.Keys) { RemoveTeamParticle(teamId); } } particleDict.Clear(); }
/// <summary> /// 風無効化 /// </summary> protected void DisableWind() { if (MagicaPhysicsManager.IsInstance() == false) { return; } if (windId >= 0) { MagicaPhysicsManager.Instance.Wind.SetEnable(windId, false, transform); } }
public override void OnInspectorGUI() { //DrawDefaultInspector(); MagicaPhysicsManager scr = target as MagicaPhysicsManager; serializedObject.Update(); Undo.RecordObject(scr, "PhysicsManager"); MainInspector(); serializedObject.ApplyModifiedProperties(); }
/// <summary> /// 指定チームのパーティクルを削除 /// </summary> /// <param name="teamId"></param> protected void RemoveTeamParticle(int teamId) { if (MagicaPhysicsManager.IsInstance()) { // パーティクル無効化 DisableTeamParticle(teamId); // パーティクル削除 var c = particleDict[teamId]; MagicaPhysicsManager.Instance.Particle.RemoveParticle(c); particleDict.Remove(teamId); } }
public void Dispose(int teamId) { if (MagicaPhysicsManager.IsInstance()) { // コライダーをチームから除外する foreach (var collider in colliderList) { if (collider) { collider.RemoveColliderParticle(teamId); } } } }
/// <summary> /// 実行状態から抜けた場合に呼ばれます /// </summary> protected override void OnInactive() { base.OnInactive(); if (status.IsInitSuccess) { if (MagicaPhysicsManager.IsInstance()) { // レンダラートランスフォーム解除 MagicaPhysicsManager.Instance.Mesh.RemoveRenderMeshBone(MeshIndex); MagicaPhysicsManager.Instance.Mesh.SetRenderMeshActive(MeshIndex, false); } } }
/// <summary> /// 実行状態から抜けた場合に呼ばれます /// </summary> protected override void OnInactive() { base.OnInactive(); if (status.IsInitSuccess) { if (MagicaPhysicsManager.IsInstance()) { MagicaPhysicsManager.Instance.Mesh.SetVirtualMeshActive(MeshIndex, false); // 利用ボーン解除 MagicaPhysicsManager.Instance.Mesh.RemoveVirtualMeshBone(MeshIndex); } } }
/// <summary> /// 破棄 /// 通常はOnDestroy()で呼ぶ /// </summary> protected override void OnDispose() { // 破棄 if (TeamId >= 0) { TeamData.Dispose(TeamId); // チーム削除 if (MagicaPhysicsManager.IsInstance()) { MagicaPhysicsManager.Instance.Team.RemoveTeam(teamId); } } }
public void ClothInactive(PhysicsTeam team) { if (MagicaPhysicsManager.IsInstance() == false) { return; } var manager = MagicaPhysicsManager.Instance; // 自身の登録ボーン開放 manager.Bone.RemoveBone(teamBoneIndex); manager.Team.SetBoneIndex(team.TeamId, -1); manager.Bone.RemoveBone(teamDirectionalDampingBoneIndex); manager.Team.SetDirectionalDampingBoneIndex(team.TeamId, false, -1, 0); }
//========================================================================================= /// <summary> /// クロス破棄 /// </summary> public void ClothDispose(PhysicsTeam team) { if (MagicaPhysicsManager.IsInstance() == false) { return; } // コンストレイント解放 MagicaPhysicsManager.Instance.Compute.RemoveTeam(team.TeamId); // パーティクル解放 team.RemoveAllParticle(); // 自身の登録ボーン開放 //MagicaPhysicsManager.Instance.Bone.RemoveBone(teamBoneIndex); }
void Help2() { MagicaPhysicsManager scr = target as MagicaPhysicsManager; #if (UNITY_2018 || UNITY_2019_1 || UNITY_2019_2_1 || UNITY_2019_2_2 || UNITY_2019_2_3 || UNITY_2019_2_4 || UNITY_2019_2_5 || UNITY_2019_2_6 || UNITY_2019_2_7 || UNITY_2019_2_8 || UNITY_2019_2_9 || UNITY_2019_2_10 || UNITY_2019_2_11 || UNITY_2019_2_12 || UNITY_2019_2_13) //if (scr.UpdateTime.UpdateBoneScale) { EditorGUILayout.HelpBox( "Required if you want to scale or flip the character at runtime.\n" + "However, it consumes CPU (Main Thread).\n" + "Be careful if you use many cloth simulations.\n" + "This is a problem for Unity 2019.2.13 or earlier.", MessageType.Info); } #endif }
protected virtual void OnDestroy() { if (Status.IsDispose) { return; } //Debug.Log("Core.OnDestroy():" + gameObject.name); status.SetDispose(); OnDispose(); // 登録削除 if (MagicaPhysicsManager.IsInstance()) { MagicaPhysicsManager.Instance.Component.RemoveComponent(this); } }
void Help1() { MagicaPhysicsManager scr = target as MagicaPhysicsManager; if (scr.UpdateMode == UpdateTimeManager.UpdateMode.OncePerFrame) { EditorGUILayout.HelpBox("[OncePerFrame] must have stable FPS.", MessageType.Info); } else if (scr.UpdateTime.IsDelay) { EditorGUILayout.HelpBox( "Delayed execution. [experimental]\n" + "Improve performance by running simulations during rendering.\n" + "Note, however, that the result is one frame late.\n" + "This delay is covered by future predictions.", MessageType.Info); } }
/// <summary> /// 指定チームのコライダーパーティクルを削除 /// </summary> /// <param name="teamId"></param> public void RemoveColliderParticle(int teamId) { if (MagicaPhysicsManager.IsInstance() == false) { return; } if (particleDict.ContainsKey(teamId)) { var c = particleDict[teamId]; for (int i = 0; i < c.dataLength; i++) { int pindex = c.startIndex + i; MagicaPhysicsManager.Instance.Team.RemoveCollider(teamId, pindex); } RemoveTeamParticle(teamId); } }
/// <summary> /// 使用頂点設定 /// </summary> /// <param name="sw"></param> void SetUseVertex(bool sw) { if (MagicaPhysicsManager.IsInstance() == false) { return; } int dcount = GetDeformerCount(); for (int i = 0; i < dcount; i++) { var deformer = GetDeformer(i); if (deformer != null) { SetDeformerUseVertex(sw, deformer, i); } } }
/// <summary> /// ルートの親トランスフォームをすべて解除する /// </summary> public void RemoveParentTransform() { if (MagicaPhysicsManager.IsInstance()) { if (parentIndexList != null && parentIndexList.Length > 0) { for (int i = 0; i < parentIndexList.Length; i++) { var index = parentIndexList[i]; if (index >= 0) { MagicaPhysicsManager.Instance.Bone.RemoveBone(index); } } } } parentIndexList = null; }
/// <summary> /// 破棄 /// </summary> public override void Dispose() { if (MagicaPhysicsManager.IsInstance()) { // メッシュ解除 if (MagicaPhysicsManager.Instance.Mesh.ExistsVirtualMesh(MeshIndex)) { foreach (var sharedChildMeshIndex in sharedChildMeshIndexList) { MagicaPhysicsManager.Instance.Mesh.RemoveSharedChildMesh(sharedChildMeshIndex); } // 利用ボーン解除 //MagicaPhysicsManager.Instance.Mesh.ResetVirtualMeshBone(MeshIndex); MagicaPhysicsManager.Instance.Mesh.RemoveVirtualMesh(MeshIndex); } } base.Dispose(); }