C# 具有状态机、协同程序和命令的Unity3D游戏
我的游戏架构和处理协同程序的方式有一些问题。我在玩一个小游戏,玩家必须点击一些瓷砖。这些瓷砖包含不同种类的纹路、物体或只是空的。根据单击的实体不同,反馈操作也不同。基本上,玩家在一块空的地砖上移动,攻击恩尼米斯,然后获得一些战利品,等等 因此,它是基于回合的,玩家在将手交给ennemies之前可以使用动作点。然后他们移动,攻击玩家自己的行为 我所面临的问题是青少年和同事之间的问题。我想在播放下一个动作之前,等待所有链接到动作的动画 我现在拥有的是一个处理状态和玩家输入的“主类”。每个状态都基于相同的接口,具有诸如Init()、Play()、End()等一般操作C# 具有状态机、协同程序和命令的Unity3D游戏,c#,unity3d,design-patterns,C#,Unity3d,Design Patterns,我的游戏架构和处理协同程序的方式有一些问题。我在玩一个小游戏,玩家必须点击一些瓷砖。这些瓷砖包含不同种类的纹路、物体或只是空的。根据单击的实体不同,反馈操作也不同。基本上,玩家在一块空的地砖上移动,攻击恩尼米斯,然后获得一些战利品,等等 因此,它是基于回合的,玩家在将手交给ennemies之前可以使用动作点。然后他们移动,攻击玩家自己的行为 我所面临的问题是青少年和同事之间的问题。我想在播放下一个动作之前,等待所有链接到动作的动画 我现在拥有的是一个处理状态和玩家输入的“主类”。每个状态都基于相
- 首先,我开始将IEnumerator与所有继承链接起来,但我发现它有点混乱,所以我改变了主意
- 其次,我以ICommand的形式重构了所有的动作(点击、移动、死亡等等)。调用Resolve()时,我从命令中获取IEnumerator。我将这些命令添加到带有一些信息(如延迟等)的队列中。当所有操作排队时,我的动画管理器会启动一些协同程序Start例程(myCommand.Resolve())来触发所有动画李>
internal class PlayerTurnDungeonState : IDungeonState
{
DungeonApplication app;
public PlayerTurnDungeonState(DungeonApplication app)
{
this.app = app;
}
public void Init()
{
app.player.RestoreMana();
}
public void Play(Player player, Entity target)
{
if (player.isReady)
{
player.isReady = false;
IItem item = player.GetActiveItem();
if (target is Opponent)
{
if (player.CanUse(item) && player.CanTarget(item, target))
{
app.animationManager.AddAnimation(
player.UseItem(item, target) //returns UseItemCommand
);
}
}
else
{
(...)
}
}
}
public void PlayerCheck(Player player, Entity entity)
{
if (player.life.value == 0)
app.GameOver();
else if (player.mana.value == 0)
app.EndOfTurn();
}
public IDungeonState GetNextTurn()
{
return new OpponentTurnState(app);
}
public void End()
{
}
}
public class UseItemCommand : ICommand
{
private IItem item;
private Entity target;
private Entity caster;
public UseItemCommand(Entity caster, IItem item, Entity target)
{
this.item = item;
this.target = target;
this.caster = caster;
}
public IEnumerator Resolve()
{
yield return caster.ConsumeAP(item.apCost);
yield return item.Use(caster, target);
}
}
class Weapon : Item
{
(...)
public override IEnumerator Use(Entity caster, Entity target)
{
yield return base.Use(caster, target);
yield return target.Hit(this.power.value);
}
}
public abstract class Item : IItem
{
(...)
public virtual IEnumerator Use(Entity caster, Entity target)
{
this.durability.value--;
}
}
流示例:在PlayerTurnState期间,当我单击被怪物占用的平铺时,它将输入发送到主类。如果玩家准备好做一些动作,我调用状态。Play(玩家,怪物)玩家检查武器是否可以使用,然后击中可怜的怪物。我必须处理一个演员动画,一个攻击动画,一个命中动画,然后有时是怪物死亡动画等等,也许还有一些我不需要任何IEnumerator的对象。。
因此,我不知道如何正确处理所有这些东西>>你知道动画师是一个状态机,甚至在运行、进入、退出状态时都有常规。我对动画师不是特别熟悉,但他们更多的是控制角色(或其他角色)上的一组单独的动画,不是吗?我在这里的目标是设计所有东西来管理许多动画师,比如同步他们或者在切换状态之前等待一些人结束。不,他们可以用于动画,但你也可以将其用作状态机,它的所有内置功能都是为什么重制你自己的-作为一个例子,谢谢,我一定要看一看:)