// ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- // その他のメソッド public void ApplyCollisionList() { // <!!> PHJointBehaviourのdisableCollisionと衝突するので要検討 if (sprObject != null) { for (int i = 0; i < collisionList.Count; i++) { CollisionSetting c = collisionList[i]; // ----- List <PHSolidBehaviour> solid1s = new List <PHSolidBehaviour>(); List <PHSolidBehaviour> solid2s = new List <PHSolidBehaviour>(); if (c.targetSetMode1 == CollisionSetting.CollisionTargetSettingMode.One) { solid1s.Add(c.solid1); } else if (c.targetSetMode1 == CollisionSetting.CollisionTargetSettingMode.NameMatching) { // -- TBD } if (c.targetSetMode2 == CollisionSetting.CollisionTargetSettingMode.One) { solid2s.Add(c.solid2); } else if (c.targetSetMode2 == CollisionSetting.CollisionTargetSettingMode.NameMatching) { // -- TBD } // ----- if (c.targetSetMode1 == CollisionSetting.CollisionTargetSettingMode.All && c.targetSetMode2 == CollisionSetting.CollisionTargetSettingMode.All) { phScene.SetContactMode(c.mode); } else if (c.targetSetMode1 == CollisionSetting.CollisionTargetSettingMode.All) { foreach (var solid2 in solid2s) { if (solid2.sprObject != null) { phScene.SetContactMode(solid2.phSolid, c.mode); } } } else if (c.targetSetMode2 == CollisionSetting.CollisionTargetSettingMode.All) { foreach (var solid1 in solid1s) { if (solid1.sprObject != null) { phScene.SetContactMode(solid1.phSolid, c.mode); } } } else { foreach (var solid1 in solid1s) { foreach (var solid2 in solid2s) { if (solid1?.sprObject != null && solid2?.sprObject != null) { phScene.SetContactMode(solid1.phSolid, solid2.phSolid, c.mode); } } } } } } }
// UnityのOnValidate : SprBehaviourのものをオーバーライド public override void OnValidate() { if (GetDescStruct() == null) { ResetDescStruct(); } if (sprObject != null) { // PHSceneの設定 { PHSceneDesc d = new PHSceneDesc(); phScene.GetDesc(d); desc.ApplyTo(d); phScene.SetDesc(d); } // PHIKEngineの設定 { PHIKEngineDesc d = new PHIKEngineDesc(); phScene.GetIKEngine().GetDesc(d); descIK.ApplyTo(d); phScene.GetIKEngine().SetDesc(d); } // DescではなくStateに含まれる変数。ApplyToで自動同期されないので手動で設定 phScene.SetTimeStep(desc.timeStep); phScene.SetHapticTimeStep(desc.haptictimeStep); // IKの有効・無効の切り替え phScene.GetIKEngine().Enable(enableIK); } // <!!> PHJointBehaviourのdisableCollisionと衝突するので要検討 if (sprObject != null) { for (int i = 0; i < collision.Count; i++) { CollisionSetting c = collision[i]; if (c.solid1 == null && c.solid2 == null) { phScene.SetContactMode(c.mode); } else if (c.solid1 == null) { if (c.solid2.sprObject != null) { phScene.SetContactMode(c.solid2.phSolid, c.mode); } } else if (c.solid2 == null) { if (c.solid1.sprObject != null) { phScene.SetContactMode(c.solid1.phSolid, c.mode); } } else { if (c.solid1.sprObject != null && c.solid2.sprObject != null) { phScene.SetContactMode(c.solid1.phSolid, c.solid2.phSolid, c.mode); } } } } }