コード例 #1
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
 IEnumerator StartSpawnFoods()
 {
     while (true)
     {
         var spawnFoodCount = Constants.INIT_FOOD_COUNT - battle.IdToFoods.Count;
         // 获取最大食物 id
         PlayArray spawnFoods = new PlayArray();
         var       nextFoodId = battle.NextFoodId;
         for (int i = 0; i < spawnFoodCount; i++)
         {
             var foodId  = nextFoodId + i;
             var foodPos = BattleHelper.RandomPos();
             var food    = new Food {
                 Id   = foodId,
                 Type = i % 3,
                 X    = foodPos.X,
                 Y    = foodPos.Y
             };
             spawnFoods.Add(food);
         }
         var eventData = new PlayObject {
             { "foods", spawnFoods },
             { "nextFoodId", nextFoodId + spawnFoodCount }
         };
         var client = LeanCloudUtils.GetClient();
         client.SendEvent(Constants.SPAWN_FOOD_EVENT, eventData);
         yield return(new WaitForSeconds(Constants.SPWAN_FOOD_DURATION));
     }
 }
コード例 #2
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnDestroy()
    {
        var client = LeanCloudUtils.GetClient();

        client.OnPlayerRoomJoined -= OnPlayerRoomJoined;
        StopAllCoroutines();
    }
コード例 #3
0
ファイル: Battle.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnBornEvent(PlayObject eventData)
    {
        Debug.Log("on born event");
        var client = LeanCloudUtils.GetClient();

        // 初始化 UI
        ui.Init();
        var playerList = client.Room.PlayerList;

        foreach (var player in playerList)
        {
            // 实例化球
            var ball = NewBall(player);
            if (player.IsLocal)
            {
                var ballCtrl = ball.gameObject.AddComponent <BallController>();
                ballCtrl.cameraTrans = cameraTrans;
            }
            else
            {
                ball.gameObject.AddComponent <BallSimulator>();
            }
        }
        ui.UpdateList();
        // 增加食物数据
        var foods = eventData.GetPlayArray("foods");

        SpawnFoods(foods);
    }
コード例 #4
0
ファイル: UI.cs プロジェクト: Yellowjump/BallBattle-Unity
    public void Init()
    {
        var client = LeanCloudUtils.GetClient();

        playerInfoList = new List <PlayerInfoItem>();
        ballInfoDict   = new Dictionary <int, BallInfoBeh>();
        StartCoroutine(Tick());
    }
コード例 #5
0
ファイル: Battle.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnDestroy()
    {
        var client = LeanCloudUtils.GetClient();

        client.OnMasterSwitched -= Client_OnMasterSwitched;
        client.OnCustomEvent    -= Client_OnCustomEvent;
        client.OnPlayerRoomLeft -= Client_OnPlayerRoomLeft;
    }
コード例 #6
0
    void OnApplicationQuit()
    {
        var client = LeanCloudUtils.GetClient();

        if (client != null)
        {
            client.Close();
        }
    }
コード例 #7
0
ファイル: Battle.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnPlayerJoinedEvent(PlayObject eventData)
    {
        var client   = LeanCloudUtils.GetClient();
        var playerId = eventData.GetInt("pId");
        var player   = client.Room.GetPlayer(playerId);
        // 实例化一个新球
        var ball = NewBall(player);

        ball.gameObject.AddComponent <BallSimulator>();
        ui.UpdateList();
    }
コード例 #8
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    /// <summary>
    /// 房主进入房间时调用
    /// </summary>
    public void InitGame()
    {
        battle           = GetComponent <Battle>();
        battle.IdToFoods = new Dictionary <int, FoodBeh>();
        battle.IdToBalls = new Dictionary <int, BallBeh>();
        // 初始化玩家
        var client = LeanCloudUtils.GetClient();

        NewPlayer(client.Player);
        // 开始定时生成小球
        StartCoroutine(StartSpawnFoods());
    }
コード例 #9
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnBallAndBallCollision(BallCollisionArgs args)
    {
        var ball1 = args.Ball1;
        var ball2 = args.Ball2;
        // 判断胜负
        var    weight1 = ball1.Player.CustomProperties.GetFloat("weight");
        var    weight2 = ball2.Player.CustomProperties.GetFloat("weight");
        Player winner, loser;

        if (weight1 > weight2)
        {
            winner = ball1.Player;
            loser  = ball2.Player;
        }
        else
        {
            winner = ball2.Player;
            loser  = ball1.Player;
        }
        var winnerWeight = weight1 + weight2;
        var props        = new PlayObject {
            { "weight", winnerWeight }
        };

        // 设置胜利方
        winner.SetCustomProperties(props);
        // 重置失败方
        var loserWeight = Mathf.Pow(Constants.BORN_SIZE, 2);
        var pos         = BattleHelper.RandomPos();

        props = new PlayObject {
            { "pos", pos },
            { "weight", loserWeight },
            { "move", null }
        };
        loser.SetCustomProperties(props);
        // 通知胜负情况
        var client    = LeanCloudUtils.GetClient();
        var eventData = new PlayObject {
            { "winnerId", winner.ActorId },
            { "loserId", loser.ActorId }
        };

        client.SendEvent(Constants.KILL_EVENT, eventData);
        // 通知重生
        eventData = new PlayObject {
            { "playerId", loser.ActorId }
        };
        client.SendEvent(Constants.REBORN_EVENT, eventData);
    }
コード例 #10
0
ファイル: UI.cs プロジェクト: Yellowjump/BallBattle-Unity
    public void UpdateList()
    {
        var client     = LeanCloudUtils.GetClient();
        var playerList = client.Room.PlayerList;

        playerList.Sort((p1, p2) => {
            var w1 = p1.CustomProperties.GetFloat("weight");
            var w2 = p2.CustomProperties.GetFloat("weight");
            return((int)(w2 - w1));
        });
        for (int i = 0; i < playerList.Count; i++)
        {
            var player         = playerList[i];
            var playerInfoItem = playerInfoList[i];
            var weight         = player.CustomProperties.GetFloat("weight");
            playerInfoItem.SetInfo(i + 1, player.UserId, (int)weight, player.IsLocal);
        }
    }
コード例 #11
0
ファイル: Battle.cs プロジェクト: Yellowjump/BallBattle-Unity
    void Start()
    {
        Physics2D.gravity = Vector2.zero;

        IdToBalls = new Dictionary <int, BallBeh>();
        IdToFoods = new Dictionary <int, FoodBeh>();
        var client = LeanCloudUtils.GetClient();

        if (client.Player.IsMaster)
        {
            var master = gameObject.AddComponent <Master>();
            master.InitGame();
        }
        client.OnMasterSwitched += Client_OnMasterSwitched;
        client.OnCustomEvent    += Client_OnCustomEvent;
        client.OnPlayerRoomLeft += Client_OnPlayerRoomLeft;
        client.ResumeMessageQueue();
    }
コード例 #12
0
    public async void OnJoinBtnClicked()
    {
        var roomId = roomIdInputField.text;

        if (string.IsNullOrEmpty(roomId))
        {
            return;
        }
        roomId = $"unity_{roomId}";
        var random = Random.Range(1, 1000000);
        var userId = random.ToString();
        var client = LeanCloudUtils.InitClient(userId);
        await client.Connect();

        await client.JoinOrCreateRoom(roomId);

        client.PauseMessageQueue();
        SceneManager.LoadScene("Battle");
    }
コード例 #13
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    async void NewPlayer(Player player)
    {
        var weight = Mathf.Pow(Constants.BORN_SIZE, 2);
        var pos    = BattleHelper.RandomPos();
        var props  = new PlayObject {
            { "weight", weight },
            { "pos", pos }
        };
        await player.SetCustomProperties(props);

        var client = LeanCloudUtils.GetClient();
        // 打包内存中的食物数据
        var foods     = battle.GetFoods();
        var eventData = new PlayObject {
            { "foods", foods }
        };
        await client.SendEvent(Constants.BORN_EVENT, eventData, new SendEventOptions {
            TargetActorIds = new List <int> {
                player.ActorId
            }
        });

        // 告知「其他玩家」有新玩家加入
        var otherIds = new List <int>();

        foreach (Player p in client.Room.PlayerList)
        {
            if (p == player)
            {
                continue;
            }
            otherIds.Add(p.ActorId);
        }
        eventData = new PlayObject {
            { "pId", player.ActorId }
        };
        await client.SendEvent(Constants.PLAYER_JOINED_EVENT, eventData, new SendEventOptions {
            TargetActorIds = otherIds
        });
    }
コード例 #14
0
    void SynchMove()
    {
        var client = LeanCloudUtils.GetClient();
        var pos    = new Vec2 {
            X = transform.localPosition.x,
            Y = transform.localPosition.y
        };
        var dir = new Vec2 {
            X = horizontal,
            Y = vertical
        };
        var move = new Move {
            Pos  = pos,
            Dir  = dir,
            Time = BattleHelper.Now
        };
        var props = new PlayObject {
            { "move", move }
        };

        client.Player.SetCustomProperties(props);
    }
コード例 #15
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    void OnBallAndFoodCollision(FoodCollisionArgs args)
    {
        var ball = args.Ball;
        var food = args.FoodBeh;

        food.gameObject.SetActive(false);
        // 增加体重
        var player = ball.Player;
        var weight = player.CustomProperties.GetFloat("weight") + Constants.FOOD_WEIGHT;
        var props  = new PlayObject {
            { "weight", weight }
        };

        player.SetCustomProperties(props);
        // 通知事件
        var eventData = new PlayObject {
            { "pId", player.ActorId },
            { "fId", food.Data.Id }
        };
        var client = LeanCloudUtils.GetClient();

        client.SendEvent(Constants.EAT_EVENT, eventData);
    }
コード例 #16
0
ファイル: Master.cs プロジェクト: Yellowjump/BallBattle-Unity
    void Start()
    {
        var client = LeanCloudUtils.GetClient();

        client.OnPlayerRoomJoined += OnPlayerRoomJoined;
    }