Пример #1
0
        public override void UpdateByFrame()
        {
            base.UpdateByFrame();

            // 雑魚が設定されていたら
            if (targetZako != null && !targetZako.Life.IsDead())
            {
                // 雑魚の座標をセットする
                View.RootTransform.SetPosition(targetZako.View.RootTransform.GetPosition());
            }

            // マウス入力で左クリックをした瞬間
            if (Input.GetMouseButton(0))
            {
                // ターゲットが見つかったら座標を変える
                var isGetTargetPosition = FindTargetPosition();

                if (!isGetTargetPosition)
                {
                    return;
                }

                // ターゲットの雑魚
                this.targetZako = FindTargetZakoFromPosition();

                View.RootTransform.SetVisible(
                    isGetTargetPosition || (targetZako != null)
                    );
            }
        }
Пример #2
0
        // オブジェクトの生成時に追加される。
        // TODO : 追加してくれるようにプログラムを書かなくては行けないは至難の技
        public void AddObject(IBattleObjectModel targetModel)
        {
            // 初期化
            targetModel.Initialize();

            // 追加
            targetModels.Add(targetModel);
        }
Пример #3
0
 public AttackParameter(
     IBattleObjectModel fromModel,
     CollisionModel targetCollision,
     float damageValue)
 {
     this.fromModel       = fromModel;
     this.TargetCollision = targetCollision;
     this.DamageValue     = damageValue;
 }
Пример #4
0
        public bool IsNearWall(IBattleObjectModel model)
        {
            var areaCollision  = map.View.GetCollision();
            var modelCollsiion = model.View.GetCollision();

            if (areaCollision.IsHamidashi(modelCollsiion))
            {
                return(true);
            }

            return(false);
        }
Пример #5
0
        private void ExtrusionZakoFromChampion(IBattleObjectModel champion, List <BattleCharacterModel> models)
        {
            var iModel     = champion;
            var iCollision = iModel.View.GetCollision();

            // 衝突判定を行わない場合はしない
            if (!iModel.View.IsCollisionEnable)
            {
                return;
            }

            for (int jTarget = 0; jTarget < models.Count; jTarget++)
            {
                var jModel     = models [jTarget];
                var jCollision = jModel.View.GetCollision();

                // 衝突判定を行わない場合はしない
                if (!jModel.View.IsCollisionEnable)
                {
                    continue;
                }

                if (iCollision.IsIn(jCollision))
                {
                    // 雑魚中心からエリア中心までのベクトル
                    Vector3 vecFromZakoToZako = iCollision.Position - jCollision.Position;

                    // 雑魚中心からエリア中心までの距離
                    float lengthFromZakoToZako = (vecFromZakoToZako).magnitude;

                    // 制限距離
                    float limitedLength = iCollision.Radius + jCollision.Radius;

                    // めり込み距離
                    float hamidashi = limitedLength - lengthFromZakoToZako;

                    // はみ出しの解除
                    iModel.View.RootTransform.SetPosition(iModel.View.RootTransform.GetPosition() + vecFromZakoToZako.normalized * hamidashi * (1.0f - ChampionCollisionSmooth));
                    jModel.View.RootTransform.SetPosition(jModel.View.RootTransform.GetPosition() - vecFromZakoToZako.normalized * hamidashi * ChampionCollisionSmooth);
                }
            }
        }
Пример #6
0
        private IBattleObjectModel FindTargetZakoFromPosition()
        {
            IBattleObjectModel kouhoZako = null;
            float minLength = float.MaxValue;

            foreach (var zako in BattleGlobal.Instance.EnemyZakoGroup.Zakos)
            {
                if (zako.View.GetCollision().IsIn(View.GetCollision()))
                {
                    var length = (zako.View.GetCollision().Position - View.GetCollision().Position).magnitude;
                    if (minLength > length)
                    {
                        kouhoZako = zako;
                        minLength = length;
                    }
                }
            }

            return(kouhoZako);
        }
Пример #7
0
 public void SetTargetModel(IBattleObjectModel targetModel)
 {
     this.targetModel = targetModel;
 }
Пример #8
0
        public override void OnUpdate()
        {
            BattleCharacterModel model = targetModel as BattleCharacterModel;

            // 数秒おきにスキルを発動

            skillTime += Time.deltaTime;
            if (skillTime > skillTimeLimit)
            {
                model.Skills.Invoke(BattleSkillsModel.SlotNumber.Slot1);

                skillTime = 0;
            }

            // スキルポイントが溜まっていたらランクアップする
            if (model.Skills.CanRankUp(BattleSkillsModel.SlotNumber.Slot1))
            {
                model.Skills.RankUp(BattleSkillsModel.SlotNumber.Slot1);
            }

            // 数秒ごとに一番近い雑魚に焦点をあわせる

            waitTime += Time.deltaTime;
            if (waitTime > waitTimeLimit)
            {
                if (movableTarget == null || isAvairable)
                {
                    // ターゲットが存在しない場合は一番近い雑魚に移動する。

                    float minLength = float.MaxValue;

                    for (int zakoIndex = 0; zakoIndex < BattleGlobal.Instance.PlayerZakoGroup.Zakos.Count; zakoIndex++)
                    {
                        var zako = BattleGlobal.Instance.PlayerZakoGroup.Zakos [zakoIndex];

                        if (!zako.View.IsCollisionEnable)
                        {
                            continue;
                        }

                        // 雑魚とキャラの虚栄を取得
                        var length = (zako.View.RootTransform.GetPosition() - targetModel.View.RootTransform.GetPosition()).magnitude;

                        // 一番距離の近い雑魚をターゲットにする
                        if (length < minLength)
                        {
                            minLength      = length;
                            movableTarget  = zako;
                            lengthFromZako = zako.View.GetCollision().Radius + model.View.GetCollision().Radius;
                        }
                    }

                    if (movableTarget != null)
                    {
                        isAvairable = false;
                    }
                }

                waitTime = 0;
            }

            // 存在しない場合は移動しない

            if (movableTarget == null || movableTarget.Life.IsDead())
            {
                movableTarget = null;
                return;
            }

            // 存在しているが到着している場合は向きのみかえる

            if (isAvairable)
            {
                // 向きを変更
                targetModel.View.Direction = movableTarget.View.RootTransform.GetPosition() - targetModel.View.RootTransform.GetPosition();

                return;
            }

            // 移動する( 本当は共通化したい ) ----------------

            // 移動先を決定
            Vector3 destinationPosition = movableTarget.View.RootTransform.GetPosition();

            // 移動方向を決める
            Vector3 vec = (destinationPosition - targetModel.View.RootTransform.GetPosition()).normalized;

            // 移動
            targetModel.View.RootTransform.SetPosition(targetModel.View.RootTransform.GetPosition() + vec * speed);

            // もしターゲットが雑魚の前方で止まる
            destinationPosition -= vec * lengthFromZako;

            //到着したら到着メッセージを送る
            if ((destinationPosition - targetModel.View.RootTransform.GetPosition()).magnitude < 0.5f)
            {
                isAvairable = true;
            }

            // 移動方向を設定
            targetModel.View.Direction = vec;
        }