public void TriggerPairEnter(PassThroughTriggerPair trigger) { //Debug.Log ("Trigger pair enter: " + trigger.name); if (LastSingleIntersection == null) { //if we have no last single intersection //then whatever just triggered this is the last single LastSingleIntersection = trigger; OnIntersect(); } enabled = true; }
public override void OnEditorRefresh() { GameObject innerTriggerColliderGameObject = gameObject.FindOrCreateChild("InnerTrigger").gameObject; innerTriggerColliderGameObject.layer = Globals.LayerNumTrigger; InnerTriggerCollider = innerTriggerColliderGameObject.GetOrAdd <BoxCollider> (); InnerTriggerCollider.isTrigger = true; State.InnerTrigger.CopyFrom(InnerTriggerCollider.transform); InnerTrigger = innerTriggerColliderGameObject.GetOrAdd <PassThroughTriggerPair> (); InnerTrigger.TriggerType = PassThroughTriggerType.Inner; GameObject outerTriggerColliderGameObject = gameObject.FindOrCreateChild("OuterTrigger").gameObject; outerTriggerColliderGameObject.layer = Globals.LayerNumTrigger; OuterTriggerCollider = outerTriggerColliderGameObject.GetOrAdd <BoxCollider> (); OuterTriggerCollider.isTrigger = true; State.OuterTrigger.CopyFrom(OuterTriggerCollider.transform); OuterTrigger = outerTriggerColliderGameObject.GetOrAdd <PassThroughTriggerPair> (); OuterTrigger.TriggerType = PassThroughTriggerType.Outer; //InnerTrigger.Sibling = OuterTrigger; //OuterTrigger.Sibling = InnerTrigger; //InnerTrigger.TargetObject = gameObject; //OuterTrigger.TargetObject = gameObject; /* * InnerTrigger.EnterFunctionName = "OnPassThroughTrigger"; * InnerTrigger.ExitFunctionName = "OnPassThroughTrigger"; * OuterTrigger.EnterFunctionName = "OnPassThroughTrigger"; * OuterTrigger.ExitFunctionName = "OnPassThroughTrigger"; */ ParentTrigger = gameObject.GetOrAdd <PassThroughTrigger> (); ParentTrigger.TargetObject = gameObject; ParentTrigger.OuterTrigger = OuterTrigger; ParentTrigger.InnerTrigger = InnerTrigger; ParentTrigger.PassThroughFunctionName = "OnPassThroughTrigger"; CrucialColliderGizmo ccgInner = InnerTriggerCollider.gameObject.GetOrAdd <CrucialColliderGizmo> (); CrucialColliderGizmo ccgOuter = OuterTriggerCollider.gameObject.GetOrAdd <CrucialColliderGizmo> (); ccgInner.fillColor = Colors.Alpha(Color.red, 0.25f); ccgOuter.fillColor = Colors.Alpha(Color.cyan, 0.25f); //there are a few things we can assume about this trigger State.Targets = WorldTriggerTarget.None; State.Behavior = AvailabilityBehavior.Max; State.NumTimesTriggered = 1; State.ColliderType = WIColliderType.None; //we make our own }
public override void OnInitialized() { GameObject innerTriggerColliderGameObject = gameObject.FindOrCreateChild("InnerTrigger").gameObject; innerTriggerColliderGameObject.layer = Globals.LayerNumTrigger; InnerTriggerCollider = innerTriggerColliderGameObject.GetOrAdd <BoxCollider> (); InnerTriggerCollider.isTrigger = true; State.InnerTrigger.ApplyTo(InnerTriggerCollider.transform, true); InnerTrigger = innerTriggerColliderGameObject.GetOrAdd <PassThroughTriggerPair> (); InnerTrigger.TriggerType = PassThroughTriggerType.Inner; GameObject outerTriggerColliderGameObject = gameObject.FindOrCreateChild("OuterTrigger").gameObject; outerTriggerColliderGameObject.layer = Globals.LayerNumTrigger; OuterTriggerCollider = outerTriggerColliderGameObject.GetOrAdd <BoxCollider> (); OuterTriggerCollider.isTrigger = true; State.OuterTrigger.ApplyTo(OuterTriggerCollider.transform, true); OuterTrigger = outerTriggerColliderGameObject.GetOrAdd <PassThroughTriggerPair> (); OuterTrigger.TriggerType = PassThroughTriggerType.Outer; //InnerTrigger.Sibling = OuterTrigger; //OuterTrigger.Sibling = InnerTrigger; //InnerTrigger.TargetObject = gameObject; //OuterTrigger.TargetObject = gameObject; ParentTrigger = gameObject.GetOrAdd <PassThroughTrigger> (); ParentTrigger.TargetObject = gameObject; ParentTrigger.OuterTrigger = OuterTrigger; ParentTrigger.InnerTrigger = InnerTrigger; ParentTrigger.PassThroughFunctionName = "OnPassThroughTrigger"; State.Behavior = AvailabilityBehavior.Always; State.Targets |= WorldTriggerTarget.Player; State.TimeOfDayRequirement = TimeOfDay.a_None; State.MissionRequirement = MissionRequireType.None; State.ObjectiveRequirement = MissionRequireType.None; State.QuestItemRequirement = string.Empty; /* * InnerTrigger.EnterFunctionName = "OnPassThroughTrigger"; * InnerTrigger.ExitFunctionName = "OnPassThroughTrigger"; * OuterTrigger.EnterFunctionName = "OnPassThroughTrigger"; * OuterTrigger.ExitFunctionName = "OnPassThroughTrigger"; */ }
public void Update() { //if we're ready to pass through if (ReadyToPassThrough) { //if both are still intersecting if (OuterTrigger.IsIntersecting && InnerTrigger.IsIntersecting) { //nothing has changed so get out of there return; } //we're no longer ready to pass through //we've either passed through or else moved back //find out which next ReadyToPassThrough = false; if (LastSingleIntersection == InnerTrigger) { //if the last single intersection was inner //then the new single intersection has to be outer //for us to have passed through if (OuterTrigger.IsIntersecting) { //we've passed through //set the last single intersection to outer LastSingleIntersection = OuterTrigger; OnPassThrough(); return; } } else //if LastSingleIntersection == OuterTrigger) { //if the last single intersection was outer //then the new single intersection has to be inner //for us to have passed through { if (InnerTrigger.IsIntersecting) { //we've passed through //set the last single intersection to outer LastSingleIntersection = InnerTrigger; OnPassThrough(); return; } } } //if we're not ready to pass through, see if we've become ready //if both are intersecting then the next time we only have one intersecting //we will have passed through the trigger if (InnerTrigger.IsIntersecting && OuterTrigger.IsIntersecting) { ReadyToPassThrough = true; //do a sanity check //if we don't have a LastSingleIntersection then something has gone wrong //take the closest collider to the player and use that instead if (LastSingleIntersection == null) { if (Vector3.Distance(InnerTrigger.transform.position, Player.Local.Position) < Vector3.Distance(OuterTrigger.transform.position, Player.Local.Position)) { Debug.Log("Last single intersection was null in door, setting to inner trigger"); LastSingleIntersection = InnerTrigger; } else { Debug.Log("Last single intersection was null in door, setting to outer trigger"); LastSingleIntersection = OuterTrigger; } } return; } //if neither trigger is intersecting then we're either done //or else something has gone wrong if (!InnerTrigger.IsIntersecting && !OuterTrigger.IsIntersecting) { //this may have happened because the player passed through the triggers //too fast for Unity to send the correct OnEnter / OnExit messages //SO we're going to try a sanity check before saying that we're done if (LastSingleIntersection != null) { LastSingleIntersection = null; } } }