stride/samples/Physics/PhysicsSample/PhysicsSample.Game/Trigger.cs
2018-06-19 18:07:32 +09:00

52 lines
1.8 KiB
C#

// Copyright (c) Xenko contributors (https://xenko.com) and Silicon Studio Corp. (https://www.siliconstudio.co.jp)
// Distributed under the MIT license. See the LICENSE.md file in the project root for more information.
using System;
using Xenko.Engine;
using Xenko.Physics;
using System.Threading.Tasks;
using Xenko.Core;
using Xenko.Engine.Events;
namespace PhysicsSample
{
public class Trigger : AsyncScript
{
[DataMemberIgnore]
public EventKey<bool> TriggerEvent = new EventKey<bool>();
public override async Task Execute()
{
var trigger = Entity.Get<PhysicsComponent>();
trigger.ProcessCollisions = true;
while (Game.IsRunning)
{
// Wait for the next collision event
var firstCollision = await trigger.NewCollision();
// Filter collisions based on collision groups
var filterAhitB = ((int)firstCollision.ColliderA.CanCollideWith) & ((int)firstCollision.ColliderB.CollisionGroup);
var filterBhitA = ((int)firstCollision.ColliderB.CanCollideWith) & ((int)firstCollision.ColliderA.CollisionGroup);
if (filterAhitB == 0 || filterBhitA == 0)
continue;
// Broadcast the collision start event
TriggerEvent.Broadcast(true);
// Wait for the collision to end and broadcast that event
Func<Task> collisionEndTask = async () =>
{
Collision collision;
do
{
collision = await trigger.CollisionEnded();
} while (collision != firstCollision);
TriggerEvent.Broadcast(false);
};
Script.AddTask(collisionEndTask);
}
}
}
}