Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有状态机、协同程序和命令的Unity3D游戏_C#_Unity3d_Design Patterns - Fatal编程技术网

C# 具有状态机、协同程序和命令的Unity3D游戏

C# 具有状态机、协同程序和命令的Unity3D游戏,c#,unity3d,design-patterns,C#,Unity3d,Design Patterns,我的游戏架构和处理协同程序的方式有一些问题。我在玩一个小游戏,玩家必须点击一些瓷砖。这些瓷砖包含不同种类的纹路、物体或只是空的。根据单击的实体不同,反馈操作也不同。基本上,玩家在一块空的地砖上移动,攻击恩尼米斯,然后获得一些战利品,等等 因此,它是基于回合的,玩家在将手交给ennemies之前可以使用动作点。然后他们移动,攻击玩家自己的行为 我所面临的问题是青少年和同事之间的问题。我想在播放下一个动作之前,等待所有链接到动作的动画 我现在拥有的是一个处理状态和玩家输入的“主类”。每个状态都基于相

我的游戏架构和处理协同程序的方式有一些问题。我在玩一个小游戏,玩家必须点击一些瓷砖。这些瓷砖包含不同种类的纹路、物体或只是空的。根据单击的实体不同,反馈操作也不同。基本上,玩家在一块空的地砖上移动,攻击恩尼米斯,然后获得一些战利品,等等

因此,它是基于回合的,玩家在将手交给ennemies之前可以使用动作点。然后他们移动,攻击玩家自己的行为

我所面临的问题是青少年和同事之间的问题。我想在播放下一个动作之前,等待所有链接到动作的动画

我现在拥有的是一个处理状态和玩家输入的“主类”。每个状态都基于相同的接口,具有诸如Init()、Play()、End()等一般操作

  • 首先,我开始将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的对象。。
因此,我不知道如何正确处理所有这些东西>>你知道动画师是一个状态机,甚至在运行、进入、退出状态时都有常规。我对动画师不是特别熟悉,但他们更多的是控制角色(或其他角色)上的一组单独的动画,不是吗?我在这里的目标是设计所有东西来管理许多动画师,比如同步他们或者在切换状态之前等待一些人结束。不,他们可以用于动画,但你也可以将其用作状态机,它的所有内置功能都是为什么重制你自己的-作为一个例子,谢谢,我一定要看一看:)