247 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C#
		
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using UnityEngine;
 | |
| using Dof;
 | |
| using Guru;
 | |
| using TMPro;
 | |
| using UnityEngine.UIElements;
 | |
| 
 | |
| public class GameClient : MonoBehaviour
 | |
| {
 | |
|     public TextMeshProUGUI infoText;
 | |
|     public TMP_InputField roomIdInput;
 | |
|     public TMP_InputField nicknameInput;
 | |
|     public GameObject[] goes;
 | |
|     public string ipAddress = "35.194.59.155";//"192.168.32.119";
 | |
|     public string roomId = "room01";
 | |
|     public string nickName = "player01";
 | |
|     public string uid = "001";
 | |
|     public int port = 7417;
 | |
| 
 | |
|     private KcpDofClient _kcpDofClient;
 | |
|     private string levelId;
 | |
|     private List<string> _levelIds = new List<string>();
 | |
|     private int _levelIndex;
 | |
|     private int _pointId;
 | |
| 
 | |
|     private void Awake()
 | |
|     {
 | |
|         Loom.Initialize();
 | |
| 
 | |
|         for (int i = 0; i < goes.Length; i++)
 | |
|         {
 | |
|             if(i > 0)
 | |
|             {
 | |
|                 goes[i].SetActive(false);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         roomIdInput.text = roomId;
 | |
|         nicknameInput.text = nickName;
 | |
| 
 | |
|         _kcpDofClient = new KcpDofClient();
 | |
|         _kcpDofClient.OnConnected += OnConnected;
 | |
|         _kcpDofClient.OnServerMessage += OnServerMessage;
 | |
|     }
 | |
| 
 | |
|     private void OnDestroy()
 | |
|     {
 | |
|         _kcpDofClient.OnConnected -= OnConnected;
 | |
|         _kcpDofClient.OnServerMessage -= OnServerMessage;
 | |
|     }
 | |
| 
 | |
|     IEnumerator _DelayCall(float delay_secs, Action callback)
 | |
|     {
 | |
|         if (delay_secs > Mathf.Epsilon)
 | |
|         {
 | |
|             yield return new WaitForSeconds(delay_secs);
 | |
|         }
 | |
| 
 | |
|         try
 | |
|         {
 | |
|             callback?.Invoke();
 | |
|         }
 | |
|         catch (Exception ex)
 | |
|         {
 | |
|             Debug.LogError($"[GameClient]_DelayCall: {ex.Message}, trace: {ex.StackTrace}");
 | |
|         }
 | |
|     }   
 | |
| 
 | |
|     public void DelayCall(float secs, Action callback)
 | |
|     {
 | |
|         StartCoroutine(_DelayCall(secs, callback));
 | |
|     }
 | |
| 
 | |
|     public void OnConnectClick()
 | |
|     {
 | |
|         Debug.Log($"[GameClient]OnConnectClick");
 | |
|         _kcpDofClient.Connect(ipAddress, port);
 | |
|     }
 | |
| 
 | |
|     public void OnPlayerEnterClick()
 | |
|     {
 | |
|         Debug.Log($"[GameClient]OnPlayerEnterClick");
 | |
|         infoText.text = $"Request PlayerEnter {roomId}";
 | |
| 
 | |
|         var msg = new ClientMessage
 | |
|         {
 | |
|             PlayerEnter = new PlayerEnter
 | |
|             {
 | |
|                 RoomId = roomIdInput.text,
 | |
|                 Uid = uid,
 | |
|                 NickName = nicknameInput.text,
 | |
|                 Country = "CN"
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         _kcpDofClient.Send(msg);
 | |
|     }
 | |
| 
 | |
|     public void OnPointClick(GameObject obj)
 | |
|     {
 | |
|         obj.SetActive(false);
 | |
|         SendPointFound(_pointId);
 | |
|         _pointId++;
 | |
|     }
 | |
|         
 | |
|     public void SendLevelPrepared(string level_id)
 | |
|     {
 | |
|         Debug.Log($"[GameClient]LevelPrepared");
 | |
|         infoText.text = $"Request LevelPrepared {level_id}";
 | |
| 
 | |
|         var msg = new ClientMessage
 | |
|         {
 | |
|             LevelPrepared = new LevelPrepared
 | |
|             {
 | |
|                 Cid = _kcpDofClient.Cid,
 | |
|                 Level = level_id
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         _kcpDofClient.Send(msg);
 | |
|     }
 | |
| 
 | |
|     public void SendPointFound(int point_id)
 | |
|     {
 | |
|         Debug.Log($"[GameClient]SendPointFound");
 | |
| 
 | |
|         infoText.text = $"Request PointFound {point_id} on level {levelId}";
 | |
| 
 | |
|         var msg = new ClientMessage
 | |
|         {
 | |
|             PointFound = new PointFound
 | |
|             {
 | |
|                 Cid = _kcpDofClient.Cid,
 | |
|                 Level = levelId,
 | |
|                 PointId = point_id
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         _kcpDofClient.Send(msg);
 | |
|     }
 | |
| 
 | |
|     public void SendLevelEnd(string level_id)
 | |
|     {
 | |
|         Debug.Log($"[GameClient]SendLevelEnd");
 | |
|         infoText.text = $"Request LevelEnd {level_id}";
 | |
| 
 | |
|         var msg = new ClientMessage
 | |
|         {
 | |
|             LevelEnd = new LevelEnd
 | |
|             {
 | |
|                 Cid = _kcpDofClient.Cid,
 | |
|                 Level = level_id
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         _kcpDofClient.Send(msg);
 | |
|     }
 | |
| 
 | |
|     public void SendAllLevelEnd()
 | |
|     {
 | |
|         Debug.Log($"[GameClient]SendAllLevelEnd");
 | |
|         infoText.text = $"Request AllLevelEnd";
 | |
| 
 | |
|         var msg = new ClientMessage
 | |
|         {
 | |
|             AllLevelEnd = new AllLevelEnd
 | |
|             {
 | |
|                 Cid = _kcpDofClient.Cid
 | |
|             }
 | |
|         };
 | |
| 
 | |
|         _kcpDofClient.Send(msg);
 | |
|     }
 | |
| 
 | |
|     private void OnConnected()
 | |
|     {
 | |
|         goes[0].SetActive(false);
 | |
|         infoText.text = $"Client connected to Server {ipAddress}:{port}";
 | |
|         goes[1].SetActive(true); // Enable PlayerEnter button
 | |
|     }
 | |
| 
 | |
|     void OnServerMessage(ServerMessage msg)
 | |
|     {
 | |
|         if (msg.PlayerEntered != null)
 | |
|         {
 | |
|             infoText.text = $"Player Enter cid: {msg.PlayerEntered.Cid}, Waiting for player";
 | |
|             goes[1].SetActive(false);            
 | |
|         }
 | |
|         else if (msg.GameStart != null)
 | |
|         {
 | |
|             infoText.text = $"Game Start";
 | |
|             foreach (var item in msg.GameStart.LevelResources)
 | |
|             {
 | |
|                 _levelIds.Add(item.LevelId);
 | |
|             }
 | |
| 
 | |
|             levelId = _levelIds[_levelIndex];
 | |
|             DelayCall(3f, () => {
 | |
|                 SendLevelPrepared(levelId);
 | |
|             });
 | |
|         }
 | |
|         else if (msg.LevelStart != null)
 | |
|         {
 | |
|             levelId = msg.LevelStart.Level;
 | |
|             infoText.text = $"Level Start {levelId}, Press point button to play";
 | |
|             goes[2].SetActive(true);
 | |
|             var trans = goes[2].transform;
 | |
| 
 | |
|             for (int i = 0; i < trans.childCount; i++)
 | |
|             {
 | |
|                 trans.GetChild(i).gameObject.SetActive(true);
 | |
|             }
 | |
|         }
 | |
|         else if (msg.PointFound != null)
 | |
|         {
 | |
|             infoText.text = $"Point Found {msg.PointFound.PointId} on level {msg.PointFound.Level}";
 | |
|             CheckLevelEnd(msg.PointFound);
 | |
|         }
 | |
|         else if (msg.GameFinish != null)
 | |
|         {
 | |
|             infoText.text = $"Game Finish";
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     void CheckLevelEnd(PointFound point_found)
 | |
|     {
 | |
|         if (point_found.PointId < 3) return;
 | |
| 
 | |
|         var level = point_found.Level;
 | |
| 
 | |
|         if(_levelIndex == _levelIds.Count - 1)
 | |
|         {
 | |
|             SendAllLevelEnd();
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         SendLevelEnd(level);
 | |
|         _levelIndex++;
 | |
|         DelayCall(1f, () => {
 | |
|             SendLevelPrepared(_levelIds[_levelIndex]);
 | |
|         });
 | |
|     }
 | |
| 
 | |
| }
 |