Exemplo n.º 1
0
        /**
         * 生成神经网络的输入数据
         * 敌人的信息 : 距离、自己对它角度、它对自己角度、敌方分数
         * 我方信息: 武器状态、 前进加速度、 转向加速度、 当前分数、 当前生命值
         * return double[] : 表示输入数组
         */
        public double[] CalculateNetworkInputs()
        {
            var inputs = new double[inputNum];
            int idx    = 0;

            for (int i = 1; i <= considerTargets; i++)
            {
                // 找到离自己第i近的敌人
                var enemy = target.ClosestKthEnemy(viewRange, i);
                // 计算距离
                inputs[idx++] = enemy != null?Vector3.Distance(transform.position, enemy.position) / viewRange : 1d;

                // 是否在射程内
                inputs[idx++] = enemy != null ? (Vector3.Distance(transform.position, enemy.position) <= shootRange)?1d : 0d : 0d;
                // 计算自己到敌人的角度
                inputs[idx++] = enemy != null?Vector3.Dot(transform.right, (enemy.position - transform.position).normalized) : 1d;

                // 计算敌人到自己的角度
                inputs[idx++] = enemy != null?Vector3.Dot(enemy.right, (transform.position - enemy.position).normalized) : 1d;

                // 敌方武器是否冷却
                inputs[idx++] = enemy != null ? (enemy.GetComponent <Tank>().weaponReady ? 1d : 0d) : 0d;
            }
            // 自己是否刚刚受到伤害
            inputs[idx++] = target.GetComponent <Unit>().isHurt ? 1d : 0d;
            // 自己的武器是否冷却完毕
            inputs[idx++] = target.weaponReady ? 1d : 0d;
            // 当前的生命值
            inputs[idx++] = target.health;
            return(inputs);
        }