private void Shoot(GameObject bulletPrefab, float force)
    {
        float monsterX = gameObject.transform.position.x;
        float monsterY = gameObject.transform.position.y;

        if (!MonsterUtil.IsCloseToPlayer(monsterX, monsterY))
        {
            return;
        }
        GameObject  bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb     = bullet.GetComponent <Rigidbody2D>();

        Vector2 target = player_rb.position;

        Vector2 lookDir = (target - GetComponent <Rigidbody2D>().position).normalized;

        float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg;

        if (player.transform.position.x < gameObject.transform.position.x)
        {
        }

        rb.rotation = angle;


        rb.AddForce(lookDir * force, ForceMode2D.Impulse);

        print("Arrived here");

        Destroy(bullet, 10.0f);
    }
    void Shoot(float force)
    {
        Vector2 target    = player_rb.position;
        var     offset    = 90f;
        Vector2 direction = target - (Vector2)transform.position;

        direction.Normalize();
        float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;


        Quaternion bullet_rotation = Quaternion.Euler(Vector3.forward * (angle + offset));
        float      monsterX        = gameObject.transform.position.x;
        float      monsterY        = gameObject.transform.position.y;

        if (!MonsterUtil.IsCloseToPlayer(monsterX, monsterY))
        {
            return;
        }
        if (curr_state == STATE.A)
        {
            Transform firePoint = isLeft ? left_firepoint : right_firepoint;
            isLeft = !isLeft;

            GameObject  bullet = Instantiate(space_bulletPrefab, firePoint.position, bullet_rotation);
            Rigidbody2D rb     = bullet.GetComponent <Rigidbody2D>();

            Vector2 lookDir = target - new Vector2(firePoint.position.x, firePoint.position.y);
            rb.AddForce(lookDir.normalized * force, ForceMode2D.Impulse);

            Destroy(bullet, 10.0f);
        }
        else
        {
            GameObject bulletLeft  = Instantiate(space_bulletPrefab, left_firepoint.position, bullet_rotation);
            GameObject bulletRight = Instantiate(space_bulletPrefab, right_firepoint.position, bullet_rotation);

            Rigidbody2D rb = bulletLeft.GetComponent <Rigidbody2D>();

            Vector2 lookDir = target - new Vector2(left_firepoint.position.x, left_firepoint.position.y);

            rb.AddForce(lookDir.normalized * force, ForceMode2D.Impulse);

            Rigidbody2D rb2      = bulletRight.GetComponent <Rigidbody2D>();
            Vector2     lookDir2 = target - new Vector2(right_firepoint.position.x, right_firepoint.position.y);
            rb2.AddForce(lookDir2.normalized * force, ForceMode2D.Impulse);

            Destroy(bulletLeft, 10.0f);
            Destroy(bulletRight, 10.0f);
        }
    }
示例#3
0
    void Shoot(GameObject bulletPrefab, float force)
    {
        float monsterX = gameObject.transform.position.x;
        float monsterY = gameObject.transform.position.y;

        if (!MonsterUtil.IsCloseToPlayer(monsterX, monsterY))
        {
            return;
        }
        GameObject  bullet = Instantiate(bulletPrefab, firePoint.position, firePoint.rotation);
        Rigidbody2D rb     = bullet.GetComponent <Rigidbody2D>();

        Vector2 lookDir = player_rb.position - monster_rb.position;

        rb.AddForce(lookDir.normalized * force, ForceMode2D.Impulse);
        Destroy(bullet, 10.0f);
    }
    // ユーザーにアイテムを付与する
    // ユーザーにアイテムを付与するときは直接GrantItemsToUserを呼ぶんじゃなくてこれを呼ぶ
    public static async Task <List <GrantedItemInstance> > GrantItemsToUserAsync(FunctionExecutionContext <dynamic> context, List <string> itemIdList)
    {
        var serverApi = new PlayFabServerInstanceAPI(context.ApiSettings, context.AuthenticationContext);

        // アイテム付与前のインベントリ情報を保持しておく
        var beforeUserInventory = await DataProcessor.GetUserInventoryAsync(context);

        var result = await serverApi.GrantItemsToUserAsync(new GrantItemsToUserRequest()
        {
            PlayFabId = context.CallerEntityProfile.Lineage.MasterPlayerAccountId,
            ItemIds   = itemIdList
        });

        var grantedItemList = result.Result.ItemGrantResults;

        // 付与したアイテムが未所持モンスターだった場合新規でモンスターデータを作成し追加
        var monsterList = grantedItemList.Where(i => ItemUtil.GetItemType(i) == ItemType.Monster).ToList();

        if (monsterList.Any())
        {
            var monsterMasterList = await DataProcessor.GetMasterAsyncOf <MonsterMB>(context);

            var notHaveMonsterList = monsterList.Where(i => !beforeUserInventory.userMonsterList.Any(u => u.monsterId == ItemUtil.GetItemId(i))).ToList();

            // 未所持のモンスターデータを作成する
            foreach (var itemInstance in notHaveMonsterList)
            {
                var level      = 1;
                var monster    = monsterMasterList.First(m => m.id == ItemUtil.GetItemId(itemInstance));
                var status     = MonsterUtil.GetMonsterStatus(monster, level);
                var customData = new UserMonsterCustomData()
                {
                    level  = level,
                    exp    = 0,
                    hp     = status.hp,
                    attack = status.attack,
                    heal   = status.heal,
                    grade  = monster.initialGrade,
                };
                await DataProcessor.UpdateUserMonsterCustomDataAsync(context, itemInstance.ItemInstanceId, customData);
            }
        }

        return(grantedItemList);
    }
        public static async Task <dynamic> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            try{
                string body = await req.ReadAsStringAsync();

                var context = JsonConvert.DeserializeObject <FunctionExecutionContext <dynamic> >(body);
                var request = JsonConvert.DeserializeObject <FunctionExecutionContext <MonsterLevelUpApiRequest> >(body).FunctionArgument;

                // 対象のモンスターを取得
                var userInventory = await DataProcessor.GetUserInventoryAsync(context);

                var userMonster = userInventory.userMonsterList.FirstOrDefault(u => u.id == request.userMonsterId);
                PMApiUtil.ErrorIf(userMonster == null, PMErrorCode.Unknown, "invalid userMonsterId");

                // 経験値を十分に保持しているかチェック
                var exp = userInventory.userPropertyList.FirstOrDefault(u => u.propertyId == (long)PropertyType.MonsterExp);
                PMApiUtil.ErrorIf(exp == null || exp.num < request.exp, PMErrorCode.Unknown, "not enough exp");

                // 何レベになるか計算
                var levelUpTableList = await DataProcessor.GetMasterAsyncOf <MonsterLevelUpTableMB>(context);

                var afterExp           = userMonster.customData.exp + request.exp;
                var targetLevelUpTable = levelUpTableList.OrderBy(m => m.id).LastOrDefault(m => m.totalRequiredExp <= afterExp);
                PMApiUtil.ErrorIf(targetLevelUpTable == null, PMErrorCode.Unknown, "invalid levelUpTable");
                var afterLevel = targetLevelUpTable.level;

                // 対象のモンスターがマスタに存在するかチェック
                var monsterList = await DataProcessor.GetMasterAsyncOf <MonsterMB>(context);

                var monster = monsterList.FirstOrDefault(m => m.id == userMonster.monsterId);
                PMApiUtil.ErrorIf(monster == null, PMErrorCode.Unknown, "invalie monsterId");

                // モンスターをレベルアップ
                var afterStatus = MonsterUtil.GetMonsterStatus(monster, afterLevel);
                var customData  = new UserMonsterCustomData()
                {
                    level  = afterLevel,
                    exp    = afterExp,
                    hp     = afterStatus.hp,
                    attack = afterStatus.attack,
                    heal   = afterStatus.heal,
                    grade  = userMonster.customData.grade,
                };
                await DataProcessor.UpdateUserMonsterCustomDataAsync(context, userMonster.id, customData);

                // 経験値を消費
                await DataProcessor.ConsumeItemAsync(context, exp.id, request.exp);

                // 強化後のレベルを返す
                var response = new MonsterLevelUpApiResponse()
                {
                    level = afterLevel
                };
                return(PlayFabSimpleJson.SerializeObject(response));
            }catch (PMApiException e) {
                // レスポンスの作成
                var response = new PMApiResponseBase()
                {
                    errorCode = e.errorCode,
                    message   = e.message
                };
                return(PlayFabSimpleJson.SerializeObject(response));
            }
        }