Ejemplo n.º 1
0
    private void CreateMonsterViewModels(IEnumerable <MapNodeVM> nodeViewModels)
    {
        var monsters = Sector.ActorManager.Items.Where(x => x.Person is MonsterPerson).ToArray();

        foreach (var monsterActor in monsters)
        {
            var actorViewModelObj = _container.InstantiatePrefab(ActorPrefab, transform);
            var actorViewModel    = actorViewModelObj.GetComponent <ActorViewModel>();

            var actorGraphicObj = _container.InstantiatePrefab(MonoGraphicPrefab, actorViewModel.transform);
            var actorGraphic    = actorGraphicObj.GetComponent <ActorGraphicBase>();

            actorViewModel.SetGraphicRoot(actorGraphic);
            actorGraphic.transform.position = new Vector3(0, /*0.2f*/ 0, -0.27f);

            var graphicController = actorViewModel.gameObject.AddComponent <MonsterSingleActorGraphicController>();
            graphicController.Actor   = monsterActor;
            graphicController.Graphic = actorGraphic;

            var actorNodeVm   = nodeViewModels.Single(x => ReferenceEquals(x.Node, monsterActor.Node));
            var actorPosition = actorNodeVm.transform.position + new Vector3(0, 0, -1);
            actorViewModel.transform.position = actorPosition;
            actorViewModel.Actor = monsterActor;

            actorViewModel.Selected   += EnemyActorVm_OnSelected;
            actorViewModel.MouseEnter += EnemyViewModel_MouseEnter;
            monsterActor.UsedAct      += ActorOnUsedAct;
            monsterActor.Person.GetModule <ISurvivalModule>().Dead += Monster_Dead;

            var fowController = actorViewModel.gameObject.AddComponent <FowActorController>();
            // Контроллеру тумана войны скармливаем только графику.
            // Потому что на основтой объект акёра завязаны блокировки (на перемещение, например).
            // Если основной объект создаст блокировку и будет отключен,
            // то он не сможет её снять в результате своих Update.
            // Это создаст всеобщую неснимаемую блокировку.
            fowController.Graphic = actorGraphic.gameObject;
            // Передаём коллайдер, чтобы в случае отключения графики скрытого актёра нельзя было выбрать.
            fowController.Collider = actorViewModel.GetComponent <Collider2D>();

            ActorViewModels.Add(actorViewModel);
        }

        var humanActors = Sector.ActorManager.Items.Where(x => x.Person is HumanPerson && x.Person != _humanPlayer.MainPerson).ToArray();

        foreach (var actor in humanActors)
        {
            var actorViewModelObj = _container.InstantiatePrefab(ActorPrefab, transform);
            var actorViewModel    = actorViewModelObj.GetComponent <ActorViewModel>();
            actorViewModel.PlayerState = _playerState;

            var actorGraphicObj = _container.InstantiatePrefab(HumanoidGraphicPrefab, actorViewModel.transform);
            var actorGraphic    = actorGraphicObj.GetComponent <ActorGraphicBase>();

            actorGraphic.transform.position = new Vector3(0, 0.2f, -0.27f);
            actorViewModel.SetGraphicRoot(actorGraphic);

            var graphicController = actorViewModel.gameObject.AddComponent <HumanActorGraphicController>();
            graphicController.Actor   = actor;
            graphicController.Graphic = actorGraphic;

            var actorNodeVm   = NodeViewModels.Single(x => x.Node == actor.Node);
            var actorPosition = actorNodeVm.transform.position + new Vector3(0, 0, -1);
            actorViewModel.transform.position = actorPosition;
            actorViewModel.Actor = actor;

            actorViewModel.Selected   += EnemyActorVm_OnSelected;
            actorViewModel.MouseEnter += EnemyViewModel_MouseEnter;
            actor.UsedAct             += ActorOnUsedAct;
            actor.Person.GetModule <ISurvivalModule>().Dead += Monster_Dead;

            var fowController = actorViewModel.gameObject.AddComponent <FowActorController>();
            // Контроллеру тумана войны скармливаем только графику.
            // Потому что на основтой объект акёра завязаны блокировки (на перемещение, например).
            // Если основной объект создаст блокировку и будет отключен,
            // то он не сможет её снять в результате своих Update.
            // Это создаст всеобщую неснимаемую блокировку.
            fowController.Graphic = actorGraphic.gameObject;
            // Передаём коллайдер, чтобы в случае отключения графики скрытого актёра нельзя было выбрать.
            fowController.Collider = actorViewModel.GetComponent <Collider2D>();

            ActorViewModels.Add(actorViewModel);
        }
    }