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); } }
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)); } }