130 lines
4.1 KiB
C#
130 lines
4.1 KiB
C#
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using NUnit.Framework;
|
|
using XGame.ActorBehavior;
|
|
using XWorld.Framework.ActorBehavior;
|
|
|
|
public sealed class ActorBehaviorPresentationRouterTests
|
|
{
|
|
[Test]
|
|
public void Dispatch_TimelineAnimation_PlaysAnimatorState()
|
|
{
|
|
var sink = new RecordingSink();
|
|
var router = new ActorBehaviorPresentationRouter();
|
|
|
|
router.Dispatch(new[]
|
|
{
|
|
new BehaviorEvent
|
|
{
|
|
Kind = BehaviorEventKind.TimelineAnimation,
|
|
ActorId = 7,
|
|
Animation = "140_skill01a_qt"
|
|
}
|
|
}, sink);
|
|
|
|
Assert.That(sink.Animations, Is.EqualTo(new[] { "7:140_skill01a_qt" }));
|
|
}
|
|
|
|
[Test]
|
|
public void Dispatch_TimelineEffect_PlaysPrefabAtEventPosition()
|
|
{
|
|
var sink = new RecordingSink();
|
|
var router = new ActorBehaviorPresentationRouter();
|
|
|
|
router.Dispatch(new[]
|
|
{
|
|
new BehaviorEvent
|
|
{
|
|
Kind = BehaviorEventKind.TimelineEffect,
|
|
ActorId = 7,
|
|
Prefab = "Assets/Game/Art/Effect/Prefab/skill/9110004_zhujue_quantao_skill01a.prefab",
|
|
Position = new BehaviorVector3(1f, 2f, 3f)
|
|
}
|
|
}, sink);
|
|
|
|
Assert.That(sink.Effects.Select(e => e.ActorId), Is.EqualTo(new[] { 7 }));
|
|
Assert.That(sink.Effects.Select(e => e.PrefabPath), Is.EqualTo(new[] { "Assets/Game/Art/Effect/Prefab/skill/9110004_zhujue_quantao_skill01a.prefab" }));
|
|
Assert.That(sink.Effects[0].Position.X, Is.EqualTo(1f));
|
|
Assert.That(sink.Effects[0].Position.Y, Is.EqualTo(2f));
|
|
Assert.That(sink.Effects[0].Position.Z, Is.EqualTo(3f));
|
|
Assert.That(sink.Effects[0].HasExplicitPosition, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Dispatch_ProjectileTimelineEffect_TreatsZeroPositionAsExplicitWorldPosition()
|
|
{
|
|
var sink = new RecordingSink();
|
|
var router = new ActorBehaviorPresentationRouter();
|
|
|
|
router.Dispatch(new[]
|
|
{
|
|
new BehaviorEvent
|
|
{
|
|
Kind = BehaviorEventKind.TimelineEffect,
|
|
ActorId = 7,
|
|
FlyObjectId = "arrow01",
|
|
Prefab = "Assets/Game/Art/Effect/Prefab/skill/hit.prefab",
|
|
Position = BehaviorVector3.Zero
|
|
}
|
|
}, sink);
|
|
|
|
Assert.That(sink.Effects[0].HasExplicitPosition, Is.True);
|
|
}
|
|
|
|
[Test]
|
|
public void Dispatch_BehaviorStopped_StopsActorPresentation()
|
|
{
|
|
var sink = new RecordingSink();
|
|
var router = new ActorBehaviorPresentationRouter();
|
|
|
|
router.Dispatch(new[]
|
|
{
|
|
new BehaviorEvent
|
|
{
|
|
Kind = BehaviorEventKind.BehaviorStopped,
|
|
ActorId = 7
|
|
}
|
|
}, sink);
|
|
|
|
Assert.That(sink.StoppedActors, Is.EqualTo(new[] { 7 }));
|
|
}
|
|
|
|
private sealed class RecordingSink : IActorBehaviorPresentationSink
|
|
{
|
|
public readonly List<string> Animations = new List<string>();
|
|
public readonly List<EffectRecord> Effects = new List<EffectRecord>();
|
|
public readonly List<int> StoppedActors = new List<int>();
|
|
|
|
public void PlayAnimation(int actorId, string stateName)
|
|
{
|
|
Animations.Add(actorId + ":" + stateName);
|
|
}
|
|
|
|
public void PlayEffect(int actorId, string prefabPath, BehaviorVector3 position, bool hasExplicitPosition)
|
|
{
|
|
Effects.Add(new EffectRecord(actorId, prefabPath, position, hasExplicitPosition));
|
|
}
|
|
|
|
public void StopActorPresentation(int actorId)
|
|
{
|
|
StoppedActors.Add(actorId);
|
|
}
|
|
}
|
|
|
|
private readonly struct EffectRecord
|
|
{
|
|
public readonly int ActorId;
|
|
public readonly string PrefabPath;
|
|
public readonly BehaviorVector3 Position;
|
|
public readonly bool HasExplicitPosition;
|
|
|
|
public EffectRecord(int actorId, string prefabPath, BehaviorVector3 position, bool hasExplicitPosition)
|
|
{
|
|
ActorId = actorId;
|
|
PrefabPath = prefabPath;
|
|
Position = position;
|
|
HasExplicitPosition = hasExplicitPosition;
|
|
}
|
|
}
|
|
}
|