对战初步完成

This commit is contained in:
lishuo committed 2022-05-10 19:24:07 +08:00
1 parent b0c0890ca3
commit 509c309252
55 files changed
+7079 -6748

No files matched your search

+2 -2
View File
@@ -23,9 +23,9 @@ namespace Assets.Scripts.Apis
});
}
public async Task<JsonResult<List<GameRoomModel>>> GetList(int pageIndex, int pageSize,int? id = null)
public async Task<JsonResult<GameRoomResult>> GetList(int pageIndex, int pageSize,string name = "")
{
return await GetAsync<JsonResult<List<GameRoomModel>>>($"GameRoom/GetList?pageIndex={pageIndex}&pageSize={pageSize}&id={id}");
return await GetAsync<JsonResult<GameRoomResult>>($"GameRoom/GetList?pageIndex={pageIndex}&pageSize={pageSize}&name={name}");
}
public JsonResult<GameRoomModel> GetDetail(int id)
+5
View File
@@ -130,6 +130,11 @@ namespace Assets.Scripts.Apis
}
return null;
}
public JsonResult<MapRouteBestInfo> GetMapBestInfo(int id)
{
var url = $"Map/GetMapBestInfo?routeId={ id }";
return Get<JsonResult<MapRouteBestInfo>>(url);
}
public async Task<JsonResult<List<NearRouteModel>>> GetNearRouteAsync(float lat, float lng, float zoom, string bounds)
{
+133 -1
View File
@@ -6,11 +6,18 @@ using System.Threading.Tasks;
namespace Assets.Scripts.Apis.Models
{
public class GameRoomResult
{
public int Total { get; set; }
public List<GameRoomModel> List { get; set; }
}
public class GameRoomModel
{
public int Id { get; set; }
public int RoomId { get; set; }
public string Name { get; set; }
public DateTime StartTime { get; set; }
public DateTime? StartTime { get; set; }
public DateTime? EndTime { get; set; }
public int CloseTime { get; set; }
public int MaxMembers { get; set; }
public int UserId { get; set; }
@@ -22,6 +29,7 @@ namespace Assets.Scripts.Apis.Models
public bool Enable3D { get; set; }
public bool EnableAR { get; set; }
public bool IsLock { get; set; }
public string Password { get; set; }
public string AltitudeGraph { get; set; }
public double AverageGrade { get; set; }
public double Distance { get; set; }
@@ -34,5 +42,129 @@ namespace Assets.Scripts.Apis.Models
public string BestWxHeadImg { get; set; }
public string BestTotalTime { get; set; }
public string FileUrl { get; set; }
public List<RoomRankItem> RoomRankingList { get;set;}
public List<RoomPlayerModel> RoomPlayerList { get; set; }
public static List<GameRoomModel> Parse(string s)
{
if (s.Equals("list"))
return null;
List<GameRoomModel> list = new List<GameRoomModel>();
try
{
var arr = s.Replace("list[", "").Replace("[","").Split(']');
foreach (var item in arr)
{
if (string.IsNullOrEmpty(item))
continue;
var detailIndex = item.IndexOf("detail");
var info = item.Substring(0, detailIndex - 1).Split(',');
var playerList = item.Substring(detailIndex);
DateTime? startTime = null;
if (!string.IsNullOrEmpty(info[18]))
{
startTime = Convert.ToDateTime(info[18]);
}
list.Add(new GameRoomModel()
{
RoomId = Convert.ToInt32(info[0]),
UserId = Convert.ToInt32(info[1]),
Name = info[2],
CloseTime = Convert.ToInt32(info[3]),
MaxMembers = Convert.ToInt32(info[4]),
MapRouteId = Convert.ToInt32(info[5]),
MapRouteName = info[6],
Distance = Convert.ToDouble(info[7]),
TotalClimb = Convert.ToDouble(info[8]),
AverageGrade = Convert.ToDouble(info[9]),
Enable3D = Convert.ToBoolean(info[10]),
EnableAR = Convert.ToBoolean(info[11]),
IsLock = Convert.ToBoolean(info[12]),
Password = info[13],
FileName = info[14],
FileUrl = info[15],
AltitudeGraph = info[16],
Status = Convert.ToInt32(info[17]),
StartTime = startTime,
RoomPlayerList = RoomPlayerModel.Parse(playerList)
});
}
}
catch (Exception ex)
{
}
//list[0,0,321313,30,5,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,213,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,:][0,0,2131,30,4,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,313,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,:][20,16652,3213,30,3,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/5/6 8:41:34:][19,16652,测试3d线路,30,2,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/5/6 1:39:57:][18,16652,测试,61,2,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/4/25 2:34:03:][17,16652,213,30,3,1217,翠屏山后山北向南,5.271609999999998,65.22760000000001,0.23308249282477278,False,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=1217,0,2022/4/25 2:20:13:]
return list;
}
}
public class RoomPlayerModel
{
public int RoomId { get; set; }
public string WxHeadImage { get; set; }
public string Name { get; set; }
public int Sex { get; set; }
public double Weight { get; set; }
public int FTP { get; set; }
public int UserId { get; set; }
public DateTime JoinAt { get; set; }
public int Status { get; set; }
public double Process { get; set; }
public bool IsOwner { get; set; }
public DateTime LastActiveTime { get; set; }
public override string ToString()
{
return $"{RoomId},{UserId},{JoinAt},{Status},{Process},{IsOwner}";
}
public static List<RoomPlayerModel> Parse(string s)
{
List<RoomPlayerModel> list = new List<RoomPlayerModel>();
s = s.Replace("detail{", "");
if (string.IsNullOrEmpty(s))
return list;
var arr = s.Split('|');
foreach (var item in arr)
{
var info = item.Split(',');
list.Add(new RoomPlayerModel()
{
RoomId = Convert.ToInt32(info[0]),
UserId = Convert.ToInt32(info[1]),
JoinAt = Convert.ToDateTime(info[2]).ToLocalTime(),
Status = Convert.ToInt32(info[3]),
Process = Convert.ToInt32(info[4]),
IsOwner = Convert.ToBoolean(info[5]),
});
}
if (list.Count > 0)
{
var ids = list.Select(c => c.UserId);
var userList = ConfigHelper.mapApi.GetOnlineUserInfo(ids).data;
foreach (var item in list)
{
var user = userList.Where(c => c.Id == item.UserId).FirstOrDefault();
item.WxHeadImage = user?.HeadImage;
item.FTP = user.FTP;
item.Weight = user.Weight;
item.Name = user.Name;
item.Sex = user.Sex;
}
}
return list;
}
}
public class RoomRankItem
{
public int UserId { get; set; }
public string WxHeadImg { get; set; }
public string NickName { get; set; }
public int Rank { get; set; }
public string Country { get; set; }
public string TotalTime { get; set; }
public bool IsDNF { get; set; }
}
}
@@ -108,5 +108,7 @@ namespace Assets.Scripts.Apis.Models
public string Source { get; set; }
public int? LastFrame { get; set; }
public int? RoomId { get; set; }
}
}
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assets.Scripts.Apis.Models
{
public class MapRouteBestInfo
{
public string BestNickName { get; set; }
public string BestWxHeadImg { get; set; }
public string BestTotalTime { get; set; }
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: db87a380e3453e5468eeaf412ccbe00c
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+6 -1
View File
@@ -60,7 +60,7 @@ public static class App
public static IDictionary<string, Texture> TextureCache = new Dictionary<string, Texture>();
public static Texture CurrentUserHeadTexture;
public static RouteResult routeResult;//骑行记录向骑行场景传值
public static GameRoomModel gameRoomDetail;
public static GameRoomModel gameRoomDetail { get; set; }
public static Texture DefaultRotateTexture { get; set; }
//全局用 输入框或者下拉框修改标志位
public static bool isChanged { get; set; }
@@ -110,6 +110,9 @@ public static class App
public readonly static bool isFullScreen = width / height > 1.8;
public static float canvasWidth { get; set; }
public static string WorkoutsUrl { get; internal set; }
public static string TcpRequestUrl { get; internal set; }
public static long delayTime { get; set; }
public static List<OnlineUser> userList = new List<OnlineUser>();
@@ -192,6 +195,8 @@ public static class App
}
}
public static string Model { get; set; }
public static bool CanOpenAd = false;
public static Dictionary<string, string> websiteDict = new Dictionary<string, string>()
+3
View File
@@ -88,5 +88,8 @@ public static class PFConstants
public static Color Red => new Color(0.8901961f, 0.2313726f, 0.1529412f, 0.6f);
public static Color Pink => new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f);
public static Color grey => new Color(0.3607843f, 0.3607843f, 0.4313726f, 1f);
public static Color Dark => new Color(0.1372549f, 0.1372549f, 0.1764706f, 1f);//23232D
public static Color LightGrey => new Color(0.3607843f, 0.3607843f, 0.4313726f, 1f); // 5C5C6E
}
+1 -1
View File
@@ -413,7 +413,7 @@ public class MainController : BaseScene
//App.MainDeviceAdapter.StopScan();
//Debug.Log("StopScan");
}
MapUDPService.Send(0, App.CurrentUser.Id, new double[]{ 0d,0d}, competitionId: 0,roomId:(App.gameRoomDetail?.Id ?? 0));
MapUDPService.Send(0, App.CurrentUser.Id, new double[]{ 0d,0d}, competitionId: 0,model:App.Model);
//发送消息
var list = MapUDPService.GetAllOnlineUserList();
@@ -105,8 +105,8 @@ namespace Assets.Scenes.Ride.Scripts
}
protected override void ShowLoading()
{
loadingPanel = panel.transform.Find("LoadingPanel").gameObject;
loadingPanel.showLoadingExtension();
//loadingPanel = panel.transform.Find("LoadingPanel").gameObject;
//loadingPanel.showLoadingExtension();
}
//初始化
public override void Init()
@@ -290,7 +290,7 @@ namespace Assets.Scenes.Ride.Scripts
{
Application.OpenURL(App.CurrentUser.WebHost + $"Mine/MatchPreview?id={cyclingController.competitionId}&Token={App.CurrentUser.cookie}");
}
protected override void StartRide(BaseEventData baseEvent)
public override void StartRide(BaseEventData baseEvent)
{
UpdateCompetition();
if (competition.Status == 4)
@@ -105,7 +105,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId,
new double[] { lastData._Lat, lastData._Lon },
recorderData.IsCompleted, false, recorderData.EndDistance,
true, 1, lastData._Speed, false, preDistance, weightKg, competitionId: recorderData.Competitionid, recorderData.Saved, 0, lastData._Power, lastData._Cadence, lastData.Ticks, (lastData._FrameRate??0));
true, 1, lastData._Speed, false, preDistance, weightKg, competitionId: recorderData.Competitionid, recorderData.Saved, 0, lastData._Power, lastData._Cadence, lastData.Ticks, (lastData._FrameRate??0),roomId: (recorderData.RoomId??0));
}
else if (recorderData.EndDistance > 0)//没有骑,但是有初始位置的情况
{
@@ -0,0 +1,79 @@
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using Assets.Scripts.Apis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
{
public class GameModel : BaseCycling
{
public GameModel(Route route,RouteResultParam param)
: base(route, CyclingModel.Single)
{
this.IsRecord = true;
recorderData = new RecorderDataModel()
{
CurrentUser = App.CurrentUser,
Competitionid = 0,
ContinueIndex = 0,
ContinueMark = Guid.NewGuid().ToString(),
EndDistance = 0,
IsCompleted = false,
IsNeedRanking = true,
CyclingState = CyclingStateEnum.Prepare,
CurrentRoute = route,
CurrentRouteStartDistance = 0,
StartTime = DateTime.Now,//UIManager.Now.GetDateTime(),//DateTime.Now
selectParam = param,
RoomId = App.gameRoomDetail.RoomId,
};
if (param != null)
{
recorderData.EndDistance = param.EndDistance;
recorderData.CurrentRouteStartDistance = param.EndDistance;
if (!string.IsNullOrWhiteSpace(param.ContinueMark))
{
recorderData.ContinueMark = param.ContinueMark;
}
else
{
param.ContinueMark = recorderData.ContinueMark;
}
recorderData.ContinueIndex = param.ContinueIndex.GetValueOrDefault(0);
}
recorderData.PreDistance = recorderData.EndDistance;
riders = new List<BaseRider>();
}
public override void Run(TargetData targetData)
{
#region 获取当前路线在线用户
riders.RemoveAll(r => r.IsSelf == false);
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id,App.gameRoomDetail.RoomId).Where(d => d.IsSelf == false)
.ToList();
foreach (var item in onlineUsers)
{
riders.Add(new OnlineRiderModel()
{
NickName = item.Name,
UserId = item.Id,
WxHeadImg = item.HeadImage,
Point = new GeoJSON.Net.Geometry.GeographicPosition(item.Point[0], item.Point[1]),
EndDistance = item.EndDistance,
PreDistance = item.PreDistance,
WeightKg = item.WeightKg,
FrameRate = item.FrameRate,
});
}
#endregion
base.Run(targetData);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 15c731fec2d5df74c8881a2cefe75fb6
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+5 -1
View File
@@ -30,7 +30,11 @@ namespace Assets.Scenes.Ride.Scripts.Model
/// <summary>
/// 环球骑行
/// </summary>
GlobalCycling = 4
GlobalCycling = 4,
/// <summary>
/// 对战模式
/// </summary>
GameRoom = 5
}
/// <summary>
+77 -7
View File
@@ -1,4 +1,5 @@
using GeoJSON.Net.Geometry;
using Assets.Scripts.Apis.Models;
using GeoJSON.Net.Geometry;
using System;
using System.Collections.Generic;
using System.Globalization;
@@ -41,6 +42,23 @@ namespace Assets.Scenes.Ride.Scripts.Model
return detail;
}
}
public class ExtendInfo
{
public int RoomId { get; set; }
public int UserId { get; set; }
public static ExtendInfo Parse(string s)
{
if (string.IsNullOrEmpty(s))
return null;
var info = s.Split(',');
var ex = new ExtendInfo()
{
UserId = Convert.ToInt32(info[0]),
RoomId = Convert.ToInt32(info[1]),
};
return ex;
}
}
public class RoomDetailModel
{
public int RoomId { get; set; }
@@ -70,6 +88,57 @@ namespace Assets.Scenes.Ride.Scripts.Model
return detail;
}
}
public class QueryGameRoomListCommand
{
public byte CommandType { get; set; }
public byte SubType { get; set; }
public int V { get; set; }
public int UserId { get; set; }
public int PageIndex { get; set; }
public int PageSize { get; set; }
public string Name { get; set; }
}
public class QueryGameRoomDetailCommand
{
public byte CommandType { get; set; }
public byte SubType { get; set; }
public int V { get; set; }
public int RoomId { get; set; }
}
public class CreateGameRoomCommand
{
public byte CommandType { get; set; }
public byte SubType { get; set; }
public int V { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int RouteId { get; set; }
public int UserId { get; set; }
public int CloseTime { get; set; }
public int MaxMembers { get; set; }
public string Password { get; set; }
public DateTime CreateTime { get; set; }
public string MapRouteName { get; set; }
public double Distance { get; set; }
public double TotalClimb { get; set; }
public double AverageGrade { get; set; }
public bool Enable3D { get; set; }
public bool EnableAR { get; set; }
public bool IsLock { get; set; }
public string FileName { get; set; }
public string FileUrl { get; set; }
public string AltitudeGraph { get; set; }
}
public class JoinGameRoomCommand
{
public byte CommandType { get; set; }
@@ -444,7 +513,9 @@ namespace Assets.Scenes.Ride.Scripts.Model
public int FrameRate { get; set; }
public int RoomId { get; set; }
public string Model { get; set; }
public DateTime? StartTime { get; set; }
public string Request { get; set; }
}
public class GzipMsgModel
@@ -507,9 +578,8 @@ namespace Assets.Scenes.Ride.Scripts.Model
public int? FrameRate { get; set; }
public int? RoomId { get; set; }
public RoomModel Room{ get; set; }
public RoomDetailModel RoomDetail { get; set; }
public DateTime? StartTime { get; set; }
public List<GameRoomModel> RoomList { get; set; }
public GameRoomModel RoomDetail { get; set; }
public static ReceiveMsgModel Parse(string str)
{
@@ -543,9 +613,6 @@ namespace Assets.Scenes.Ride.Scripts.Model
HeartRate = Convert.ToDouble(list[11], CultureInfo.InvariantCulture),
Cadence = Convert.ToDouble(list[12], CultureInfo.InvariantCulture),
TotoalTicks = Convert.ToInt32(list[13], CultureInfo.InvariantCulture),
FrameRate = Convert.ToInt32(list[14], CultureInfo.InvariantCulture),
//RoomId = Convert.ToInt32(list[15], CultureInfo.InvariantCulture),
//StartTime = startTime,
};
}
catch(Exception e)
@@ -580,6 +647,7 @@ namespace Assets.Scenes.Ride.Scripts.Model
return "Online-" + this.Id;
}
}
public int Sex { get; set; }
public bool IsVirtual { get; set; }
/// <summary>
@@ -680,6 +748,8 @@ namespace Assets.Scenes.Ride.Scripts.Model
public int? FrameRate { get; set; }
public int RoomId { get; set; }
public RoomModel Room { get; set; }
public RoomDetailModel RoomDetail { get; set; }
@@ -106,6 +106,8 @@ namespace Assets.Scenes.Ride.Scripts.Model
public DateTime EndTime { get; set; }
public int? LastFrame { get; set; }
public int? RoomId { get; set; }
/// <summary>
/// 是否已经保存成功
/// </summary>
@@ -180,7 +182,8 @@ namespace Assets.Scenes.Ride.Scripts.Model
Param = Newtonsoft.Json.JsonConvert.SerializeObject(selectParam),
GlobalCyclingId = 0,
Source = "",
LastFrame = LastFrame
LastFrame = LastFrame,
RoomId = RoomId
};
//var range = new MapSpeedRange().GetSpeedRange(RiderDatas, CurrentRoute.RouteInstance.Distance);
interruptRecord.SpeedRange = null; //JsonConvert.SerializeObject(range);
@@ -41,6 +41,8 @@ namespace Assets.Scenes.Ride.Scripts
}
private static DateTime LastActiveTime = DateTime.Now;
private static List<ReceiveMsgModel> msgs = new List<ReceiveMsgModel>();
public static Action<List<ReceiveMsgModel>> MessageListener { get; set; }
/// <summary>
/// 初始化(如果UDP服务未启动,则会已没5秒一次不断尝试,直到连接上为止,前端不需要考虑任何UDP连接的事情)
/// </summary>
@@ -61,9 +63,10 @@ namespace Assets.Scenes.Ride.Scripts
_udpService.Start(list =>
{
LastActiveTime = DateTime.Now;
//onlineUserHelper.RemoveExceptionData(list);
msgs = list;
//onlineUserHelper.RemoveExceptionData(list);
msgs = list;
onlineUserHelper.SetOnlineUser(msgs);
MessageListener?.Invoke(list);
});
heartbeat = new System.Timers.Timer();
@@ -109,18 +112,48 @@ namespace Assets.Scenes.Ride.Scripts
SendHeartbeat();
}
}
//获取房间人物列表
private static void SendGameRoomListPlayers(int[] roomIds)
//查询房间
public static void SendQueryGameRoomList(int userId,int pageIndex,int pageSize,string roomIdOrName)
{
var model = new
var cmd = new QueryGameRoomListCommand()
{
UserId = userId,
PageIndex = pageIndex,
PageSize = pageSize,
Name = roomIdOrName,
CommandType = 3,
SubType = 6,
V = 2,
};
var sendBytes = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(cmd));
_udpService.Send(sendBytes, sendBytes.Length);
}
//创建房间
public static void SendCreateGameRoom(string name, int routeId, string pwd, DateTime createTime , int closeTime, int maxMembers,double averageGrade,double totalClimb,double distance,bool enable3D,bool enableAR,string mapName,string fileName,string fileUrl,string altitudeGraph)
{
var cmd = new CreateGameRoomCommand() {
Id = 0,
UserId = App.CurrentUser.Id,
Name = name,
RouteId = routeId,
Password = pwd,
CreateTime = createTime,
CloseTime = closeTime,
MaxMembers= maxMembers,
MapRouteName = mapName,
EnableAR = enableAR,
Enable3D = enable3D,
Distance = distance,
TotalClimb = totalClimb,
AverageGrade = averageGrade,
AltitudeGraph = altitudeGraph,
FileName = fileName,
FileUrl = fileUrl,
CommandType = 3,
SubType = 0,
V = 2,
};
var sendBytes = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(model));
var sendBytes = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(cmd));
_udpService.Send(sendBytes, sendBytes.Length);
}
//加入对战房间
@@ -130,8 +163,8 @@ namespace Assets.Scenes.Ride.Scripts
{
CommandType = 3,
SubType = 1,
UserId = userId,
RoomId = roomId,
UserId = userId,
JoinAt = startTime,
V = 2,
};
@@ -280,13 +313,13 @@ namespace Assets.Scenes.Ride.Scripts
/// <param name="exit">是否退出</param>
public static void Send(int RouteId, int MemberId, double[] Point, bool IsCompleted = false, bool exit = false,
double endDistance = 0, bool showVirtual = false, byte commandType = 1, double speed = 0, bool isVirtual = false, double preDistance = 0,
double weightKg = 0, int competitionId = 0, bool saved = false,double? heartRate = 0, double power = 0, double? cadence = 0,int totalTicks = 0, int frameRate = 0, int roomId = 0,DateTime? startTime = null)
double weightKg = 0, int competitionId = 0, bool saved = false,double? heartRate = 0, double power = 0, double? cadence = 0,int totalTicks = 0, int frameRate = 0, int roomId = 0,string model = "",DateTime? startTime = null,string request = "")
{
try
{
Point[0] = Math.Round(Point[0], 6, MidpointRounding.AwayFromZero);
Point[1] = Math.Round(Point[1], 6, MidpointRounding.AwayFromZero);
var model = new MsgModel
var msgmodel = new MsgModel
{
RouteId = RouteId,
MemberId = MemberId,
@@ -309,11 +342,13 @@ namespace Assets.Scenes.Ride.Scripts
Competitionid = competitionId,
Saved = saved,
FrameRate = frameRate,
RoomId = roomId,//房间Id
StartTime = startTime
RoomId = roomId,
Model = model,//是否在对战房间列表或者房间内
StartTime = startTime,
Request = request,
//V = 1
};
var sendBytes = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(model));
var sendBytes = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(msgmodel));
_udpService.Send(sendBytes, sendBytes.Length);
}
@@ -331,7 +366,7 @@ namespace Assets.Scenes.Ride.Scripts
if (MapUDPService._udpService == null) return;
for (int i = 0; i < 3; i++)
{
Send(0, App.CurrentUser.Id, new double[] { 1, 1 }, true, isExit);
Send(0, App.CurrentUser.Id, new double[] { 1, 1 }, true, isExit,model:App.Model);
}
_udpService.Close();
@@ -417,6 +452,13 @@ namespace Assets.Scenes.Ride.Scripts
return result;
}
public static List<OnlineUser> GetOnlineUsers(int routeId,int roomId)
{
var result = onlineUserHelper.OnlineUsers.Where(u => u.RoomId == roomId && u.RouteId == routeId).ToList();
return result;
}
public static List<OnlineUser> GetAllOnlineUserList()
{
var result = onlineUserHelper.OnlineUsers.Where(c => !c.IsSelf).ToList();
@@ -438,12 +480,12 @@ namespace Assets.Scenes.Ride.Scripts
return result;
}
public static int GetNearRiderCount()
public static int GetNearRiderCount(int roomId = 0)
{
int count = 0;
try
{
count = onlineUserHelper.OnlineUsers.Where(c => (c.Point[0] != 0 && c.Point[1] != 0) && (c.Point[0] != -1 && c.Point[1] != -1)).Count();
count = onlineUserHelper.OnlineUsers.Where(c => (c.Point[0] != 0 && c.Point[1] != 0) && (c.Point[0] != -1 && c.Point[1] != -1) && c.RoomId == roomId).Count();
}
catch (Exception)
{
@@ -469,13 +511,13 @@ namespace Assets.Scenes.Ride.Scripts
/// 获取附近的人(当前在线的所有人)
/// </summary>
/// <returns></returns>
public static IList<NearRiderModel> GetNearRiderData(int pageIndex, int pageSize = 5, double[] point = null)
public static IList<NearRiderModel> GetNearRiderData(int pageIndex, int pageSize = 5, double[] point = null,int roomId = 0)
{
if (point == null) return null;
try
{
var dict = new List<System.Tuple<double, OnlineUser>>();
var allOnlineUsers = onlineUserHelper.OnlineUsers.Where(c => c.CompetitionId == 0);
var allOnlineUsers = onlineUserHelper.OnlineUsers.Where(c => c.CompetitionId == 0 && c.RoomId == roomId);
foreach (var item in allOnlineUsers)
{
if (item.Id == App.CurrentUser.Id)
@@ -580,7 +622,6 @@ namespace Assets.Scenes.Ride.Scripts
}
user.LastActiveTime = DateTime.Now;
user.RouteId = item.RouteId;
user.Point = item.Point;
user.IsCompleted = item.IsCompleted;
//user.exit = item.exit;
@@ -606,8 +647,7 @@ namespace Assets.Scenes.Ride.Scripts
user.IsWatcher = user.WatcherList.Contains(item.MemberId);
user.CreateTime = DateTime.MaxValue;
user.FrameRate = item.FrameRate;
user.Room = item.Room;
user.RoomDetail = item.RoomDetail;
user.RoomId = (item.RoomId ?? 0);
}
else
{
@@ -12,6 +12,7 @@ using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NetCoreServer;
using Assets.Scripts.Apis.Models;
namespace Assets.Scenes.Ride.Scripts.Network
{
@@ -46,7 +47,7 @@ namespace Assets.Scenes.Ride.Scripts.Network
if (_tcpClient == null) return;
if (_tcpClient.IsConnected == false) return;
//_tcpClient.WriteLine(System.Text.Encoding.ASCII.GetString(dgram));
var txt = System.Text.Encoding.ASCII.GetString(dgram);
var txt = System.Text.Encoding.UTF8.GetString(dgram);
//Debug.WriteLine("发送:"+txt);
try
{
@@ -199,28 +200,29 @@ namespace Assets.Scenes.Ride.Scripts.Network
//房间信息
if (t.IndexOf('g') == 0)
{
RoomModel room = null;
var x = t.Replace("g{", "").Replace("}", "");
room = RoomModel.Parse(x);
//list[0,0,321313,30,5,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,213,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,:][0,0,2131,30,4,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,313,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,:][20,16652,3213,30,3,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/5/6 8:41:34:][19,16652,测试3d线路,30,2,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/5/6 1:39:57:][18,16652,测试,61,2,5492,福州化工路-鼓山峰爬坡线路,19.17906,815.9704000000002,4.0466336723489045,True,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=5492,0,2022/4/25 2:34:03:][17,16652,213,30,3,1217,翠屏山后山北向南,5.271609999999998,65.22760000000001,0.23308249282477278,False,False,True,,,,http://192.168.0.102:5082/Map/AltitudeGraph?id=1217,0,2022/4/25 2:20:13:]
var li = GameRoomModel.Parse(x);
foreach (var i in list)
{
i.Room = room;
i.RoomList = li;
}
}
//房间用户信息
if (t.IndexOf('d') == 0)
//对战骑行场景中信息
if (t.IndexOf('e') == 0)
{
var g = t.Replace("d{", "").Replace("}", "");
var g = t.Replace("e{", "").Replace("}", "");
var glist = g.Split('|');
foreach (var i in glist)
{
var gameRoom = RoomDetailModel.Parse(i);
var owner = list.Where(c => c.MemberId == gameRoom.UserId).FirstOrDefault();
if (string.IsNullOrEmpty(i))
continue;
var extendInfo = ExtendInfo.Parse(i);
var owner = list.Where(c => c.MemberId == extendInfo.UserId).FirstOrDefault();
if (owner != null)
{
owner.RoomDetail = gameRoom;
owner.RoomId = extendInfo.RoomId;
}
}
}
@@ -48,7 +48,12 @@ namespace Assets.Scenes.Ride.Scripts
{
App.TextureCache.Clear();
mapApi = new MapApi();
//ShowLoading();
ShowLoading();
}
public float GetProcess()
{
return process;
}
protected virtual void Update()
@@ -195,7 +200,7 @@ namespace Assets.Scenes.Ride.Scripts
cyclingController.ReSetUIManager();
cyclingController.GoContinueRide();
}
protected virtual void StartRide(BaseEventData baseEvent)
public virtual void StartRide(BaseEventData baseEvent)
{
if (!rideNow.IsInteractable())
return;
@@ -207,6 +212,16 @@ namespace Assets.Scenes.Ride.Scripts
StartGame();
}
public void StartRide(int seconds)
{
processText.gameObject.SetActive(true);
slider.gameObject.SetActive(true);
depressFlag = true;
slider.DOValue(process, 0);
StartGame();
transform.gameObject.SetActive(false);
}
protected virtual void Cancel(BaseEventData baseEvent)
{
SceneManager.LoadScene("MainScene");
@@ -719,6 +719,9 @@ public class CyclingController : DeviceServiceMonoBase
case CyclingModel.Competition:
cyclingController = new CompetitionModel(route, selectParamModel, currentPlayer);
break;
case CyclingModel.GameRoom:
cyclingController = new GameModel(route, selectParamModel);
break;
}
GameStart();
InitPlayer();//初始化人物方向等
@@ -40,9 +40,19 @@ namespace Assets.Scenes.Ride.Scripts
protected override void ShowLoading()
{
loadingPanel = panel.transform.Find("LoadingPanel").gameObject;
loadingPanel.showLoadingExtension();
if (App.gameRoomDetail != null)
{
ShowGameRoomLoading();
loadingPanel = panel.transform.Find("LoadingPanel").gameObject;
loadingPanel.showLoadingExtension();
}
}
private void ShowGameRoomLoading()
{
UIManager.SetModalPanel(transform.Find("ModalPanel").GetComponent<PFUIPanel>());
UIManager.ShowGameRoomLoadingPanel();
}
//初始化
public override void Init()
{
@@ -34,9 +34,10 @@ namespace Assets.Scenes.Ride.Scripts
}
protected override void CreateList()
{
OnlineUserNum.text = " "+ MapUDPService.GetNearRiderCount().ToString();
var roomId = cyclingController.cyclingController == null ? 0 : (cyclingController.cyclingController.recorderData.RoomId ?? 0);
OnlineUserNum.text = " "+ MapUDPService.GetNearRiderCount(roomId).ToString();
LayoutRebuilder.ForceRebuildLayoutImmediate(OnlineUserNum.rectTransform);
var nearList = MapUDPService.GetNearRiderData(pageIndex, pageSize, new double[] { playerController.Currentlatlong.x, playerController.Currentlatlong.y });
var nearList = MapUDPService.GetNearRiderData(pageIndex, pageSize, new double[] { playerController.Currentlatlong.x, playerController.Currentlatlong.y },roomId);
if (nearList == null)
return;
var mod = MapUDPService.GetNearRiderCount() % pageSize;
@@ -17,8 +17,10 @@ namespace Assets.Scenes.Ride.Scripts
UIManager.AddEvent(singleButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, SingleRide);
UIManager.AddEvent(shadowButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShadowRide);
UIManager.AddEvent(addButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShowSelectPlayer);
selectPanel.SetActive(true);//显示选择单人、影子骑行模式
if (App.gameRoomDetail == null)
{
selectPanel.SetActive(true);//显示选择单人、影子骑行模式
}
}
protected override void Update()
{
@@ -151,5 +153,15 @@ namespace Assets.Scenes.Ride.Scripts
countDownTxt.gameObject.SetActive(true);
countDownTxt.text = count.ToString();
}
public void StartRide(int seconds)
{
mainController.SetCyclingModel(CyclingModel.GameRoom);
count = seconds;
startPanel.SetActive(false);
startBtn.gameObject.SetActive(false);
countDownTxt.gameObject.SetActive(true);
countDownTxt.text = count.ToString();
}
}
}
@@ -214,7 +214,7 @@ namespace Assets.Scripts.Scenes.VideoRide
distance = 0;
}
//一旦有功率就开始骑行、否则暂停
if (!manager.IsQuit() && manager.CurrentPlayer.UserId == UserId && !manager.IsQuit())
if (!manager.IsQuit() && manager.CurrentPlayer.UserId == UserId && !manager.IsQuit() && manager.cyclingModel == Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single)
{
if (power > 0)
{
@@ -65,6 +65,8 @@ namespace Assets.Scripts.Scenes.VideoRide
//移动当前线上其他人头像
private void MoveOnlinePlayerHead()
{
if (manager.cyclingController == null)
return;
var players = manager.cyclingController.riders;
var headList = FindObjectsOfType<HeadScript>();
var videoPlayer = manager.CurrentPlayer;
@@ -108,8 +108,8 @@ namespace Assets.Scripts.Scenes.VideoRide
};
}
endDistance = 0;
//倒计时5s开始
SetCyclingModel(CyclingModel.Single);
////倒计时5s开始
//SetCyclingModel(CyclingModel.Single);
videoLoading = FindObjectOfType<VideoLoading>();
@@ -121,13 +121,15 @@ namespace Assets.Scripts.Scenes.VideoRide
}
VideoLoading videoLoading { get; set; }
// Update is called once per frame
float timer = 0.5f;
float timer = 0f;
void Update()
{
timer -= Time.deltaTime;
while (timer <= 0)
{
cyclingController?.Run(null);
if (cyclingController == null)
return;
cyclingController.Run(null);
var onlineRiders = cyclingController.riders;
try
{
@@ -137,7 +139,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{
Debug.Log(e.Message);
}
timer += 0.5f;
timer += 1f;
}
}
MapRouteRankingList rankingList;
@@ -335,6 +337,9 @@ namespace Assets.Scripts.Scenes.VideoRide
case CyclingModel.Single:
cyclingController = new SingleModel(route, selectParamModel);
break;
case CyclingModel.GameRoom:
cyclingController = new GameModel(route, selectParamModel);
break;
}
}
//模拟登录
@@ -478,6 +483,7 @@ namespace Assets.Scripts.Scenes.VideoRide
cyclingController.recorderData.ManufacturerName = ManufacturerName;
cyclingController.recorderData.DeviceNumber = DeviceNumber;
cyclingController.recorderData.LastFrame = GetCurrentFrame();
cyclingController.recorderData.RoomId = App.gameRoomDetail?.RoomId;//房间ID
RankingId = cyclingController.recorderData.SaveWithLocalRecordAysnc(cyclingModel, selectParamModel, imageFileName, recordId, path);
}
@@ -211,11 +211,26 @@ namespace Assets.Scripts.Scenes.VideoRide
var ui = manager.GetCanvasTransform();
canvasGroup.DOFade(0, 1).onComplete += () => {
gameObject.SetActive(false);
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
ui.Find("Panel").gameObject.SetActive(true);
};
}
public void StartRide(int seconds)
{
var ui = manager.GetCanvasTransform();
canvasGroup.DOFade(0, 0).onComplete += () => {
gameObject.SetActive(false);
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.GameRoom);
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
ui.Find("Panel").gameObject.SetActive(true);
};
UIManager.ShowGameRoomCountDownPanel(seconds,()=> {
manager.StartGame();
});
}
protected void Download(BaseEventData baseEvent)
{
StartCoroutine(Utils.DownloadVideo(route.FileName, route.Url
@@ -0,0 +1,71 @@
using System;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.UI.Control
{
[RequireComponent(typeof(ScrollRect))]
public class PFUIPageHelper : PFUIComponentBase
{
public Transform content;
public GameObject preBtn;
public GameObject nextBtn;
public GameObject btnPrefab;
public int PageIndex { get; set; }
public int PageSize { get; set; } = 6;
public int Total { get; set; }
private Action<int> CallBack { get; set; }
public void Register(Action<int> refresh)
{
CallBack = refresh;
UIManager.AddEvent(preBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
Previous();
});
UIManager.AddEvent(nextBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
Next();
});
}
public void Build()
{
Utils.DestroyChildren(content);
for (int i = 1; i <= Total; i++)
{
var g = Instantiate(btnPrefab, content);
g.transform.Find("Text").GetComponent<Text>().text = i.ToString();
}
}
//上一页
private void Previous()
{
var newIndex = PageIndex - 1;
var index = newIndex < 0 ? 0 : newIndex;
if (index != PageIndex)
{
PageIndex = index;
CallBack?.Invoke(PageIndex);
}
}
//下一页
private void Next()
{
var newIndex = PageIndex + 1;
var index = newIndex >= Total ? Total-1 : newIndex;
if (index != PageIndex)
{
PageIndex = index;
CallBack?.Invoke(PageIndex);
}
}
//指定到第几页
private void Redirect(int index)
{
PageIndex = index;
CallBack?.Invoke(PageIndex);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 284f6a5c33c31f14da608779c7797369
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -9,6 +9,7 @@ using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using Assets.Scripts;
using Assets.Scenes.Ride.Scripts;
public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandler, IEndDragHandler,IScrollHandler
{
@@ -39,18 +40,21 @@ public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandle
public RawImage AltitudeGraphImg;
public RawImage Owner;
public RawImage Head1;
public RawImage Head2;
public RawImage Head3;
public RawImage Head4;
public RawImage Head5;
public GameObject IconOwnerLight;
public RawImage HeadPrefab;
public Transform Content;
public GameObject JoinBtn;
public GameObject CycingBtn;
public GameObject ResultBtn;
public GameObject Lock;
public GameObject LockL;
public GameObject D2;
public GameObject D3;
public GameObject AR;
public GameObject D2L;
public GameObject D3L;
public GameObject ARL;
private ScrollRect Scroll;
private bool IsLock;
@@ -70,11 +74,42 @@ public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandle
{
LockL.SetActive(IsLock);
Lock.SetActive(false);
D2.SetActive(false);
D2L.SetActive(Enable2d);
D3.SetActive(false);
D3L.SetActive(Enable3d);
AR.SetActive(false);
ARL.SetActive(EnableAR);
var list = GetComponentsInChildren<GameRoomHead>();
foreach (var item in list)
{
item.ShowLight();
}
});
UIManager.AddEvent(gameObject, EventTriggerType.PointerExit, (e) =>
{
LockL.SetActive(false);
Lock.SetActive(IsLock);
D2.SetActive(Enable2d);
D2L.SetActive(false);
D3.SetActive(Enable3d);
D3L.SetActive(false);
AR.SetActive(EnableAR);
ARL.SetActive(false);
var list = GetComponentsInChildren<GameRoomHead>();
foreach (var item in list)
{
item.ShowShadow();
}
});
UIManager.AddEvent(JoinBtn, EventTriggerType.PointerClick, (e) =>
{
@@ -88,6 +123,16 @@ public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandle
manager.ShowDownLoadConfirm();
}
});
//对战正在进行
UIManager.AddEvent(CycingBtn, EventTriggerType.PointerClick, (e) =>
{
manager.ShowCycingPanel(gameRoom);
});
//对战已经结束
UIManager.AddEvent(ResultBtn, EventTriggerType.PointerClick, (e) =>
{
manager.ShowDonePanel(gameRoom.RoomId);
});
}
private float timer = 1f;
private void Update()
@@ -98,7 +143,9 @@ public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandle
timer += 1f;
}
}
private bool Enable2d { get; set; }
private bool Enable3d { get; set; }
private bool EnableAR { get; set; }
//This is called from the SetCell method in DataSource
public void ConfigureCell(GameRoomModel cell, int cellIndex)
{
@@ -119,15 +166,39 @@ public class GameRoomCell : MonoBehaviour, ICell, IBeginDragHandler, IDragHandle
RouteNameTxt.text = cell.MapRouteName;
RouteNameLightTxt.text = cell.MapRouteName;
IdTxt.text = cell.Id.ToString().PadLeft(7,'0');
IdTxt.text = cell.RoomId.ToString().PadLeft(7,'0');
IsLock = cell.IsLock;
Id = cell.Id;
Id = cell.RoomId;
//房间状态
JoinBtn.SetActive(cell.Status == 0);
CycingBtn.SetActive(cell.Status == 1);
ResultBtn.SetActive(cell.Status == 2);
Enable2d = !cell.Enable3D && !cell.EnableAR;
Enable3d = cell.Enable3D && !cell.EnableAR;
EnableAR = cell.EnableAR;
D2.SetActive(Enable2d);
D3.SetActive(Enable3d);
AR.SetActive(EnableAR);
Lock.SetActive(IsLock);
LockL.SetActive(false);
Utils.DisplayImage(AltitudeGraphImg, cell.AltitudeGraph);
Utils.DisplayImage(Owner, cell.WxHeadImg);
var playerList = cell.RoomPlayerList;
if (playerList != null)
{
MembersTxt.text = $"{playerList.Count}/{cell.MaxMembers}";
var s = playerList.Select(c => c.UserId);
var user = ConfigHelper.mapApi.GetOnlineUserInfo(s);
foreach (var item in playerList)
{
var obj = Instantiate(HeadPrefab, Content);
obj.GetComponent<GameRoomHead>().Set(item.WxHeadImage,item.IsOwner);
}
}
}
public void UpdateItem(string name, string gender, string id)
{
@@ -0,0 +1,43 @@
using Assets.Scripts;
using UnityEngine;
using UnityEngine.UI;
public class GameRoomHead : MonoBehaviour
{
public Image IconOwnerLightImg;
public Image IconOwnerImg;
public RawImage Head;
private bool IsOwner { get; set; }
private float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
timer += 1f;
}
}
public void Set(string headUrl,bool isOwner)
{
Utils.DisplayImage(Head, headUrl);
IsOwner = isOwner;
IconOwnerImg.gameObject.SetActive(isOwner);
}
public void ShowLight()
{
IconOwnerImg.gameObject.SetActive(false);
IconOwnerLightImg.gameObject.SetActive(IsOwner);
}
public void ShowShadow()
{
IconOwnerImg.gameObject.SetActive(IsOwner);
IconOwnerLightImg.gameObject.SetActive(false);
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c7fd898b102fbad479f0d0037b505976
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -1,6 +1,7 @@
using Assets.Scenes.Ride.Scripts;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using Assets.Scripts.UI.Control;
using PolyAndCode.UI;
using System;
using System.Collections.Generic;
@@ -11,11 +12,8 @@ using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
class GameRoomList : MonoBehaviour, IRecyclableScrollRectDataSource
class GameRoomList : MonoBehaviour
{
[SerializeField]
RecyclableScrollRect _recyclableScrollRect;
[SerializeField]
RectTransform _rectTransform;
@@ -29,18 +27,33 @@ class GameRoomList : MonoBehaviour, IRecyclableScrollRectDataSource
private int _dataLength;
private bool _isInit;
private GameObject RoomCell { get; set; }
//Dummy data List
private List<GameRoomModel> _list = new List<GameRoomModel>();
private string seachName = "";
PFUIPageHelper pageHelper;
//Recyclable scroll rect's data source must be assigned in Awake.
private void Awake()
{
_recyclableScrollRect.DataSource = this;
RoomCell = Resources.Load<GameObject>("UI/Prefab/GameRoom/Room");
//分页
pageHelper = FindObjectOfType<PFUIPageHelper>();
pageHelper.PageIndex = 0;
pageHelper.PageSize = 6;
pageHelper.Register((e) =>
{
_ = GetDataAsync();
});
_ = GetDataAsync();
_searchInputField.onValueChanged.AddListener((e) => {
if (!string.IsNullOrEmpty(e))
_searchInputField.onValueChanged.AddListener((e) => { seachName = e; });
_searchInputField.onEndEdit.AddListener((e) => {
if (!string.IsNullOrEmpty(name))
{
_ = GetDataAsync(Convert.ToInt32(e));
_ = GetDataAsync();
}
else
{
@@ -53,14 +66,23 @@ class GameRoomList : MonoBehaviour, IRecyclableScrollRectDataSource
{
_ = GetDataAsync();
}
private async Task GetDataAsync(int? id =null)
private async Task GetDataAsync()
{
if (_list != null) _list.Clear();
var result = await ConfigHelper.GameRoomApi.GetList(0, 1000, id);
var result = await ConfigHelper.GameRoomApi.GetList(pageHelper.PageIndex, pageHelper.PageSize, seachName);
if (result.result)
{
_list = result.data;
_recyclableScrollRect.ReloadData();
Utils.DestroyChildren(_rectTransform);
_list = result.data.List;
int index = 0;
foreach (var item in _list)
{
index++;
var g = Instantiate(RoomCell, _rectTransform);
g.GetComponent<GameRoomCell>().ConfigureCell(item, index);
}
pageHelper.Total = result.data.Total;
pageHelper.Build();
}
}
float timer = 1f;
@@ -72,28 +94,5 @@ class GameRoomList : MonoBehaviour, IRecyclableScrollRectDataSource
timer += 1f;
}
}
#region DATA-SOURCE
/// <summary>
/// Data source method. return the list length.
/// </summary>
public int GetItemCount()
{
return _list.Count;
}
/// <summary>
/// Data source method. Called for a cell every time it is recycled.
/// Implement this method to do the necessary cell configuration.
/// </summary>
public void SetCell(ICell cell, int index)
{
//Casting to the implemented Cell
var item = cell as GameRoomCell;
item.ConfigureCell(_list[index], index);
}
#endregion
}
@@ -134,7 +134,7 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
var fileName = map.FileName;
var path = PFConstants.VideoFolder;
var filepath = path + "/" + fileName;
if ((map.EnableAR && !File.Exists(filepath) )|| !map.EnableAR)
//if ((map.EnableAR && !File.Exists(filepath) )|| !map.EnableAR)
{
var list = FindObjectsOfType<GameRoomMapItem>();
foreach (var item in list)
@@ -28,20 +28,26 @@ class GameRoomPassword : MonoBehaviour
passwordInput.text = "";
}
private async void ConfirmClick(BaseEventData baseEventData)
private void ConfirmClick(BaseEventData baseEventData)
{
if (string.IsNullOrEmpty(Password))
{
Utils.showToast(gameObject, App.GetLocalString("room password can not be empty"));
return;
}
var RoomId = manager.GetRoomId();
var result = await ConfigHelper.GameRoomApi.ConfirmRoomPwd(RoomId, Password);
if (!result.result)
var room = manager.GetCurrentRoom();
if (room != null && !room.Password.Equals(Password))
{
Utils.showToast(gameObject, result.errMsg);
Utils.showToast(gameObject, App.GetLocalString("Wrong password"));
return;
}
//var RoomId = manager.GetRoomId();
//var result = await ConfigHelper.GameRoomApi.ConfirmRoomPwd(RoomId, Password);
//if (!result.result)
//{
// Utils.showToast(gameObject, result.errMsg);
// return;
//}
Refresh();
gameObject.SetActive(false);
manager.ShowDownLoadConfirm();
@@ -27,12 +27,14 @@ class GameRoomPlayerPanel : MonoBehaviour
public int UserId { get; set; }
public bool NotUse { get; private set; }
private void Start()
{
var manager = FindObjectOfType<GameRoomDetailController>();
var inviteBtn = inviteModal.transform.Find("InviteBtn").gameObject;
UIManager.AddEvent(inviteBtn,EventTriggerType.PointerClick,(e)=> {
Utils.CopyToClipboard($"GameRoom/{manager.GameRoom.Id}");
Utils.CopyToClipboard($"GameRoom/{manager.GameRoom.RoomId}");
Utils.showToast(transform.parent.gameObject, App.GetLocalString("copy to clipboard successfully!"));
});
UIManager.AddEvent(gameObject, EventTriggerType.PointerClick, (e) =>
@@ -45,11 +47,11 @@ class GameRoomPlayerPanel : MonoBehaviour
});
UIManager.AddEvent(kickBtn, EventTriggerType.PointerClick, (e) =>
{
MapUDPService.SendGameRoomKick(App.gameRoomDetail.Id, UserId, App.CurrentUser.Id);
MapUDPService.SendGameRoomKick(App.gameRoomDetail.RoomId, UserId, App.CurrentUser.Id);
});
}
public void Init(int userId, string userName,string headUrl,double weight, float ftp,bool isOwner,int Status)
public void Init(int userId, string userName,string headUrl,double weight, float ftp,bool isOwner,int Status,int sex)
{
UserId = userId;
inviteModal.SetActive(false);
@@ -65,7 +67,7 @@ class GameRoomPlayerPanel : MonoBehaviour
ready.SetActive(!isOwner && Status == 1);
}
public void UpdatePlayer(int userId, string userName, string headUrl, double weight, float ftp, bool isOwner, int Status)
public void UpdatePlayer(int userId, string userName, string headUrl, double weight, float ftp, bool isOwner, int Status,int sex)
{
UserId = userId;
inviteModal.SetActive(false);
@@ -91,22 +93,20 @@ class GameRoomPlayerPanel : MonoBehaviour
{
ready.SetActive(false);
}
public void ForceQuit()
{
//TODO:踢人
NotInUse();
}
public void ShowQuitModal()
{
kickModal.SetActive(true);
}
public void ShowInviteModal()
{
NotUse = false;
UserId = 0;
notInUseModal.SetActive(false);
inviteModal.SetActive(true);
}
public void NotInUse()
{
NotUse = true;
UserId = 0;
notInUseModal.SetActive(true);
}
@@ -115,5 +115,10 @@ class GameRoomPlayerPanel : MonoBehaviour
{
me.SetActive(true);
}
private void OnDisable()
{
ShowInviteModal();
}
}
@@ -0,0 +1,51 @@
using Assets.Scripts.Apis.Models;
using System;
using UnityEngine;
using UnityEngine.UI;
public class GameRoomCountDownController : PFUIPanel
{
public Text count;
private int Seconds { get; set; }
public GameRoomModel GameRoom { get; set; }
private Action Callback { get; set; }
protected override void Awake()
{
base.Awake();
}
public override void Show()
{
base.Show();
}
public void Init(int seconds,Action action)
{
Seconds = seconds;
Callback = action;
}
float timer = 0f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
if (Seconds == 0)
{
Callback?.Invoke();
}
if (Seconds < 0)
{
gameObject.SetActive(false);
}
count.text = Seconds.ToString();
Seconds--;
timer += 1f;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b84f9a966f56dc54d8e49acc631ae62f
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -8,6 +8,7 @@ using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using Assets.Scenes.Ride.Scripts.Model;
public class GameRoomDetailController : PFUIPanel
{
@@ -31,27 +32,35 @@ public class GameRoomDetailController : PFUIPanel
public GameObject quitBtn;
public GameObject cancelBtn;
public GameObject d2;
public GameObject d3;
public GameObject ar;
public GameRoomModel GameRoom { get; set; }
public DateTime? StartTime { get; set; }
public int Status { get; set; }
protected override void Start()
{
base.Start();
UIManager.AddBackHandler((e) =>
{
MapUDPService.SendGameRoomKick(GameRoom.RoomId,App.CurrentUser.Id,App.CurrentUser.Id);
App.gameRoomDetail = null;
});
transform.Find("MainNav").GetComponent<MainNav>().ShowBack();
Utils.DisplayHead(Avatar, App.CurrentUser.WxHeadImg);
UIManager.AddEvent(startBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
//判断房间内的人是否都准备
var list = MapUDPService.GetGameRoomList(GameRoom.Id);
var notReady = list.Where(c => c.RoomDetail.Status == 0 && c.RoomDetail.IsOwner == false).Any();
var list = GameRoom.RoomPlayerList;
var notReady = list.Where(c => c.Status == 0 && c.IsOwner == false).Any();
if (notReady)
{
Utils.showToast(gameObject,App.GetLocalString("have to wait for all ready!"));
Utils.showToast(gameObject, App.GetLocalString("have to wait for all ready!"));
}
else
{
MapUDPService.SendGameRoomStartTime(App.gameRoomDetail.Id, App.CurrentUser.Id);
}
MapUDPService.SendGameRoomStartTime(App.gameRoomDetail.RoomId, App.CurrentUser.Id);
}
});
//准备
UIManager.AddEvent(readyBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
@@ -59,7 +68,7 @@ public class GameRoomDetailController : PFUIPanel
Status = 1;
readyBtn.SetActive(false);
cancelBtn.SetActive(true);
MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.Id, App.CurrentUser.Id, Status);
MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status);
});
//取消准备
UIManager.AddEvent(cancelBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
@@ -67,133 +76,180 @@ public class GameRoomDetailController : PFUIPanel
Status = 0;
readyBtn.SetActive(true);
cancelBtn.SetActive(false);
MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.Id, App.CurrentUser.Id, Status);
MapUDPService.SendGameRoomReadyStatus(App.gameRoomDetail.RoomId, App.CurrentUser.Id, Status);
});
//退出
UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
App.gameRoomDetail = null;
MapUDPService.SendGameRoomKick(GameRoom.RoomId, App.CurrentUser.Id, App.CurrentUser.Id);
UIManager.ShowGameRoomListPanel();
});
}
public override void Show()
{
base.Show();
GameRoom = App.gameRoomDetail;
Init();
}
private bool DataSourceChanged { get; set; }
private void ListenerHandler(List<ReceiveMsgModel> message)
{
try
{
var detail = message.FirstOrDefault();
if (detail != null)
{
if (detail.RoomList != null)
{
GameRoom = detail.RoomList.Where(c => c.RoomId == GameRoom.RoomId).FirstOrDefault();
DataSourceChanged = true;
}
}
}
catch (Exception e)
{
}
}
float timer = 0f;
private void Update()
{
TcpHandler();
timer -= Time.deltaTime;
while (timer < 0)
{
TcpHandler();
timer += 1f;
}
}
private void Init()
{
UIManager.AddEvent(startBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
//TODO:
});
UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
//TODO:
});
UIManager.AddEvent(cancelBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, (e) =>
{
//TODO:
});
idText.text = GameRoom.Id.ToString().PadLeft(7, '0');
App.Model = "GameRoom";
MapUDPService.MessageListener = ListenerHandler;
GameRoom = App.gameRoomDetail;
var enable2d = !GameRoom.Enable3D && !GameRoom.EnableAR;
var enable3d = GameRoom.Enable3D && !GameRoom.EnableAR;
d2.SetActive(enable2d);
d3.SetActive(enable3d);
ar.SetActive(GameRoom.EnableAR);
DataSourceChanged = true;
MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, 0, 1, GameRoom.RoomId.ToString());
readyBtn.SetActive(true);
cancelBtn.SetActive(false);
startBtn.SetActive(false);
idText.text = GameRoom.RoomId.ToString().PadLeft(7, '0');
roomName.text = GameRoom.Name;
routeName.text = GameRoom.MapRouteName;
distanceText.text = $"{Math.Round(GameRoom.Distance, 1)}KM";
eleText.text = $"{Math.Round(GameRoom.TotalClimb, 0)}M";
slopeText.text = $"{Math.Round(GameRoom.AverageGrade, 1)}%";
if (!string.IsNullOrEmpty(GameRoom.BestNickName))
//查询某线路最佳
var result = ConfigHelper.mapApi.GetMapBestInfo(GameRoom.MapRouteId);
if (result.result && !string.IsNullOrEmpty(result.data.BestNickName))
{
bestTab.SetActive(true);
bestTabName.text = GameRoom.BestNickName;
bestTabTimer.text = GameRoom.BestTotalTime;
Utils.DisplayHead(bestTabHead, GameRoom.BestWxHeadImg);
bestTabName.text = result.data.BestNickName;
bestTabTimer.text = result.data.BestTotalTime;
Utils.DisplayHead(bestTabHead, result.data.BestWxHeadImg);
}
Utils.DisplayHead(altitudeGraph, GameRoom.AltitudeGraph);
var playerList = FindObjectsOfType<GameRoomPlayerPanel>();
foreach (var item in playerList)
{
if (GameRoom.MaxMembers - item.sort < 0)
{
item.NotInUse();
}
else
{
item.ShowInviteModal();
}
}
}
private void TcpHandler()
{
MapUDPService.Send(0, App.CurrentUser.Id, new double[] { 0d, 0d }, competitionId: 0, roomId: GameRoom.Id);
var list = MapUDPService.GetGameRoomList(GameRoom.Id);
var playerList = FindObjectsOfType<GameRoomPlayerPanel>();
//自己
var mine = list.Where(c => c.RoomDetail.UserId == App.CurrentUser.Id).FirstOrDefault();
if (mine != null)
if (DataSourceChanged)
{
//是否是房主
var owner = mine.RoomDetail.IsOwner;
readyBtn.SetActive(!owner);
startBtn.SetActive(owner);
//是否准备
//readyBtn.SetActive(!owner && mine.RoomDetail.Status == 0);
//cancelBtn.SetActive(!owner && mine.RoomDetail.Status == 1);
}
//新增/更新
foreach (var item in list)
{
var current = playerList.Where(c => c.UserId == item.Id).FirstOrDefault();
if (current == null)
var playerList = FindObjectsOfType<GameRoomPlayerPanel>();
var list = GameRoom.RoomPlayerList;
//自己
var mine = list.Where(c => c.UserId == App.CurrentUser.Id).FirstOrDefault();
if (mine != null)
{
var s = playerList.Where(c => c.UserId == 0).OrderBy(c => c.sort).FirstOrDefault();
if (s != null)
{
s.Init(item.Id, item.Name, item.HeadImage, item.Weight, item.FTP, item.RoomDetail.IsOwner, item.RoomDetail.Status);
}
//是否是房主
var owner = mine.IsOwner;
readyBtn.SetActive(!owner);
startBtn.SetActive(owner);
}
else
//新增/更新
foreach (var item in list)
{
current.UpdatePlayer(item.Id, item.Name, item.HeadImage, item.Weight, item.FTP, item.RoomDetail.IsOwner, item.RoomDetail.Status);
}
}
//删除
foreach (var item in playerList)
{
if (item.UserId != 0)
{
var current = list.Where(c => c.Id == item.UserId).FirstOrDefault();
var userName =item.Name;
var headurl = item.WxHeadImage;
var ftp = item.FTP;
var weight = item.Weight;
var sex = item.Sex;
var current = playerList.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (current == null)
{
item.ShowInviteModal();
var s = playerList.Where(c => c.UserId == 0 && c.NotUse == false).OrderBy(c => c.sort).FirstOrDefault();
if (s != null)
{
s.Init(item.UserId, userName, headurl, weight, ftp, item.IsOwner, item.Status,sex);
}
}
var myself = list.Where(c => c.RoomDetail.UserId == App.CurrentUser.Id).FirstOrDefault();
if (myself == null)
else
{
Utils.showToast(gameObject, App.GetLocalString("you've been kicked out of the room"));
UIManager.ShowGameRoomListPanel();
current.UpdatePlayer(item.UserId, userName, headurl, weight, ftp, item.IsOwner, item.Status,sex);
}
}
}
//收到服务器开始命令进入 loading页面
var roomStart = list.Where(c => c.Room != null && c.Room.Status == 1).FirstOrDefault();
if (roomStart != null)
{
//UIManager.ShowGameRoomLoadingPanel();
//路线
App.RouteIdParam = GameRoom.MapRouteId;
if (GameRoom.EnableAR)
//删除
foreach (var item in playerList)
{
SceneManager.LoadScene("VideoPlay");
if (item.UserId != 0)
{
var current = list.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (current == null)
{
item.ShowInviteModal();
}
var myself = list.Where(c => c.UserId == App.CurrentUser.Id).FirstOrDefault();
//被移除房间 or 掉线 or
if (myself == null)
{
//Utils.showToast(gameObject, App.GetLocalString("you've been kicked out of the room"));
UIManager.ShowGameRoomListPanel();
}
}
}
else
//收到服务器开始命令进入 loading页面
if (GameRoom.Status == 1)
{
SceneManager.LoadScene("Ride");
//路线
App.RouteIdParam = GameRoom.MapRouteId;
if (GameRoom.EnableAR)
{
SceneManager.LoadScene("VideoPlay");
}
else
{
SceneManager.LoadScene("Ride");
}
}
DataSourceChanged = false;
}
}
protected override void OnDisable()
{
//App.gameRoomDetail = null;
}
protected override void OnDestroy()
{
//App.gameRoomDetail = null;
}
}
@@ -1,9 +1,13 @@
using Assets.Scenes.Ride.Scripts;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using Assets.Scripts.UI.Control;
using Assets.Scripts.UI.Prefab.MapList;
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
@@ -63,6 +67,10 @@ public class GameRoomListController : PFUIPanel
private GameObject btn6;
private Transform enterRoomModal;
private Transform cycingRoomModal;
private Transform resultRoomModal;
private GameObject RoomRankItem;
private string RoomName;
private string Roompwd;
@@ -72,9 +80,93 @@ public class GameRoomListController : PFUIPanel
private int Members;
private GameRoomModel GameRoom;
[SerializeField]
RectTransform _rectTransform;
[SerializeField]
InputField _searchInputField;
[SerializeField]
GameObject _searchBtn;
private GameObject RoomCell { get; set; }
//Dummy data List
private List<GameRoomModel> _list = new List<GameRoomModel>();
private string seachName = "";
private bool ListChanged = false;
private bool CreateRoomSuccessed = false;
PFUIPageHelper pageHelper;
protected override void Awake()
{
base.Awake();
RoomRankItem = Resources.Load<GameObject>("UI/Prefab/GameRoom/RoomRankItem");
RoomCell = Resources.Load<GameObject>("UI/Prefab/GameRoom/Room");
//分页
pageHelper = FindObjectOfType<PFUIPageHelper>();
pageHelper.PageIndex = 0;
pageHelper.PageSize = 6;
pageHelper.Register((e) =>
{
});
_searchInputField.onValueChanged.AddListener((e) => { seachName = e; });
_searchInputField.onEndEdit.AddListener((e) => {
seachName = e;
MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, pageHelper.PageIndex, pageHelper.PageSize, seachName);
});
UIManager.AddEvent(_searchBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, Search);
}
private void Search(BaseEventData data)
{
MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, pageHelper.PageIndex, pageHelper.PageSize, seachName);
}
private void Refreash()
{
Utils.DestroyChildren(_rectTransform);
if (list == null)
return;
int index = 0;
foreach (var item in list)
{
index++;
var g = Instantiate(RoomCell, _rectTransform);
g.GetComponent<GameRoomCell>().ConfigureCell(item, index);
}
pageHelper.Total = 10;
pageHelper.Build();
}
List<GameRoomModel> list;
private void ListenerHandler(List<ReceiveMsgModel> message)
{
try
{
//查询列表
var roomList = message.Where(c => c.RoomList != null).FirstOrDefault();
if (roomList != null)
{
list = roomList.RoomList;
ListChanged = true;
}
//查询自己当前创建的房间信息并进入
var info = message.Where(c => c.RoomList.Where(o => o.UserId == App.CurrentUser.Id).Any()).FirstOrDefault();
if (info != null)
{
GameRoom = info.RoomList[0];
App.gameRoomDetail = GameRoom;
CreateRoomSuccessed = true;
}
}
catch (Exception e)
{
}
}
protected override void Start()
{
@@ -86,30 +178,41 @@ public class GameRoomListController : PFUIPanel
MapList = transform.Find("MapList").gameObject;
enterRoomModal = transform.Find("EnterRoomModal");
cycingRoomModal = transform.Find("GameRoomInProgress");
resultRoomModal = transform.Find("GameRoomDone");
InitStep1();
}
public override void Show()
{
base.Show();
App.Model = "GameRoom";
MapUDPService.MessageListener = ListenerHandler;
MapUDPService.SendQueryGameRoomList(App.CurrentUser.Id, pageHelper.PageIndex, pageHelper.PageSize, seachName);
}
float timer = 1f;
private void Update()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
timer -= Time.deltaTime;
if (cycingRoomModal.gameObject.activeSelf)
{
if (scroll.GetComponent<ScrollRect>().verticalNormalizedPosition <= 0 ||
scroll.GetComponent<ScrollRect>().verticalNormalizedPosition >= (pageIndex == 0 ? 1.2 : 1))
{
startMouse = true;
}
var s = UIManager.Now.GetDateTime() - modelGameRoom.StartTime.Value.ToLocalTime();
CyclingTimer.text = Helper.FormatTicks((int)s.TotalSeconds);
}
else
while (timer < 0)
{
if (startMouse)
if (ListChanged)
{
startMouse = false;
OnEndDrag(null);
Refreash();
ListChanged = false;
}
}
if (Input.GetKeyDown(KeyCode.KeypadEnter) || Input.GetKeyDown(KeyCode.Return))
{
onEndEdit();
if (CreateRoomSuccessed & CreateClicked)
{
CreateRoomSuccessed = false;
CreateClicked = false;
UIManager.ShowGameRoomDetailPanel();
}
timer += 1f;
}
}
private void InitStep1()
@@ -128,6 +231,8 @@ public class GameRoomListController : PFUIPanel
distanceOptions = topContainer.Find("distanceOptions");
if (distanceOptions != null)
{
distance = "";
distanceOptions.GetComponent<Dropdown>().value = 0;
var dDropdown = distanceOptions.GetComponent<Dropdown>();
dDropdown.options = MapFilterOptions.distances;
dDropdown.onValueChanged.AddListener(ChangeDistance);
@@ -138,6 +243,9 @@ public class GameRoomListController : PFUIPanel
//是否是3d
if (tdContainer != null)
{
var g = tdContainer.Find("Gou").gameObject;
g.SetActive(false);
is3d = false;
UIManager.AddEvent(tdContainer.gameObject, EventTriggerType.PointerClick, (b) =>
{
var gou = tdContainer.Find("Gou").gameObject;
@@ -150,6 +258,9 @@ public class GameRoomListController : PFUIPanel
//是否收藏
if (favContainer != null)
{
var g = favContainer.Find("Gou").gameObject;
g.SetActive(false);
isFav = false;
UIManager.AddEvent(favContainer.gameObject, EventTriggerType.PointerClick, (b) =>
{
var gou = favContainer.Find("Gou").gameObject;
@@ -163,6 +274,8 @@ public class GameRoomListController : PFUIPanel
searchInput = topContainer.Find("SearchInput");
if (searchInput != null)
{
searchInput.GetComponent<InputField>().text = "";
ftname = "";
searchInput.GetComponent<InputField>().onEndEdit.AddListener((s) =>
{
var t = searchInput.GetComponent<InputField>().text;
@@ -178,11 +291,16 @@ public class GameRoomListController : PFUIPanel
var diffOptions = topContainer.Find("DifficultyContainer");
if (diffOptions != null)
{
hands = new List<string>();
foreach (Transform t in diffOptions)
{
var button = t.GetComponent<Button>();
var image = t.GetComponent<Image>();
var text = t.Find("Text").GetComponent<Text>();
ColorUtility.TryParseHtmlString("#23232D", out Color cc);
image.color = cc;
text.color = new Color(1, 1, 1, 1);
UIManager.AddEvent(button.gameObject, EventTriggerType.PointerClick, (b) =>
{
ColorUtility.TryParseHtmlString("#23232D", out Color c1);
@@ -291,19 +409,19 @@ public class GameRoomListController : PFUIPanel
HandleStepBtn(previous.name);
});
UIManager.AddEvent(create, EventTriggerType.PointerClick, async (e) =>
UIManager.AddEvent(create, EventTriggerType.PointerClick, (e) =>
{
var result = await ConfigHelper.GameRoomApi.Add(RoomName,selectedRouteId,Roompwd,UIManager.Now.GetDateTime(),CloseTime,Members);
if (result.result)
{
MapList.SetActive(false);
}
else
{
UIManager.ShowAlert("error", result.errMsg);
}
MapUDPService.SendCreateGameRoom(RoomName, selectedRouteId, Roompwd, UIManager.Now.GetDateTime(), CloseTime, Members, Map.AverageGrade, (Map.TotalClimb ?? 0), Map.Distance, Map.Enable3D, Map.EnableAR, Map.Name, Map.FileName, Map.Url, Map.AltitudeGraph);
MapList.SetActive(false);
CreateClicked = true;
});
}
private bool CreateClicked { get; set; }
private void ResetMapList()
{
}
private void InitStep2()
{
//关门时间
@@ -322,6 +440,16 @@ public class GameRoomListController : PFUIPanel
var minInputField = right2.transform.Find("MinInputField").GetComponent<InputField>();
var roomNameInputField = right2.transform.Find("RoomNameInputField").GetComponent<InputField>();
var passwordInputField = right2.transform.Find("PasswordInputField").GetComponent<InputField>();
hourInputField.text = "0";
minInputField.text = "0";
roomNameInputField.text = "";
passwordInputField.text = "";
RoomName = "";
Roompwd = "";
hourInputField.GetComponent<Outline>().enabled = false;
HandleFormInput();
HandleCloseTimeBtnClick(0, "");
HandleMembersBtnClick(0, "");
//房间名
roomNameInputField.onValueChanged.AddListener((e) => {
RoomName = e;
@@ -336,11 +464,10 @@ public class GameRoomListController : PFUIPanel
hourInputField.GetComponent<Outline>().enabled = true;
HandleFormInput();
});
UIManager.AddEvent(btn30,EventTriggerType.PointerClick, (e) =>
{
HandleCloseTimeBtnClick(30, btn30.name);
});
UIManager.AddEvent(btn30, EventTriggerType.PointerClick, (e) =>
{
HandleCloseTimeBtnClick(30, btn30.name);
});
UIManager.AddEvent(btn40, EventTriggerType.PointerClick, (e) =>
{
HandleCloseTimeBtnClick(40, btn40.name);
@@ -420,7 +547,7 @@ public class GameRoomListController : PFUIPanel
create.GetComponent<Button>().enabled = false;
}
}
private void HandleCloseTimeBtnClick(int closeTime,string btnName)
private void HandleCloseTimeBtnClick(int closeTime, string btnName)
{
ColorUtility.TryParseHtmlString("#3D3E4D", out Color grey);
ColorUtility.TryParseHtmlString("#F93086", out Color pink);
@@ -431,7 +558,7 @@ public class GameRoomListController : PFUIPanel
btn60.GetComponent<Image>().color = btn60.name == btnName ? pink : grey;
HandleFormInput();
}
private void HandleMembersBtnClick(int members,string btnName)
private void HandleMembersBtnClick(int members, string btnName)
{
ColorUtility.TryParseHtmlString("#3D3E4D", out Color grey);
ColorUtility.TryParseHtmlString("#F93086", out Color pink);
@@ -474,49 +601,114 @@ public class GameRoomListController : PFUIPanel
var path = PFConstants.VideoFolder;
var filepath = path + "/" + fileName;
var download = transform.Find("DownloadPanel").gameObject;
if (!File.Exists(filepath))
if (GameRoom.EnableAR && !File.Exists(filepath))
{
download.SetActive(true);
download.GetComponent<GameRoomDownLoad>().Init(RoomId, GameRoom.FileName, GameRoom.FileUrl, this);
}
else
GetInRoom();
}
private GameRoomModel modelGameRoom { get; set; }
//private GameRoomModel modelGameRoom { get; set; }
private Text CyclingTimer { get; set; }
public void ShowCycingPanel(GameRoomModel gameRoomModel)
{
ShowStatusModal(cycingRoomModal, gameRoomModel);
//倒计时
modelGameRoom = gameRoomModel;
CyclingTimer = cycingRoomModal.Find("Modal/Timer").GetComponent<Text>();
}
public void ShowDonePanel(int roomId)
{
var result = ConfigHelper.GameRoomApi.GetDetail(roomId);
if (result.result)
{
if (File.Exists(filepath))
ShowStatusModal(resultRoomModal, result.data);
resultRoomModal.Find("Modal/EndTime").GetComponent<Text>().text = result.data.EndTime.HasValue?result.data.EndTime.Value.ToLocalTime().ToString(): "--:--:--";
//排行榜
var list = result.data.RoomRankingList;
var content = resultRoomModal.Find("Modal/Scroll View/Viewport/Content");
Utils.DestroyChildren(content);
foreach (var item in list)
{
GetInRoom();
var t = Instantiate(RoomRankItem, content);
t.transform.Find("Bg").gameObject.SetActive(App.CurrentUser.Id == item.UserId);
t.transform.Find("Rank").GetComponent<Text>().text = item.Rank.ToString().PadLeft(2,'0');
Utils.DisplayImage(t.transform.Find("Head").GetComponent<RawImage>(), item.WxHeadImg);
t.transform.Find("Country").GetComponent<RawImage>().texture = UIManager.Instance.loginRegOptions.GetCountryImageByName(item.Country);
t.transform.Find("Name").GetComponent<Text>().text = item.NickName;
t.transform.Find("Timer").GetComponent<Text>().text = item.TotalTime;
}
}
}
private void ShowStatusModal(Transform tr,GameRoomModel data)
{
tr.Find("Modal/Id").GetComponent<Text>().text = data.RoomId.ToString().PadLeft(7, '0');
tr.Find("Modal/RoomName").GetComponent<Text>().text = data.Name;
tr.Find("Modal/RouteName").GetComponent<Text>().text = data.MapRouteName;
var graph = tr.Find("Modal/AltitudeGraph").GetComponent<RawImage>();
var bestHead = tr.Find("Modal/BestTab/Head").GetComponent<RawImage>();
var bestName = tr.Find("Modal/BestTab/NickName").GetComponent<Text>();
var bestTimer = tr.Find("Modal/BestTab/Timer").GetComponent<Text>();
bestName.text = data.BestNickName;
bestTimer.text = data.BestTotalTime;
Utils.DisplayImage(graph, data.AltitudeGraph);
Utils.DisplayImage(bestHead, data.BestWxHeadImg);
tr.Find("Modal/Props/DistanceText").GetComponent<Text>().text = data.Distance.ToString("f1") + "KM";
tr.Find("Modal/Props/EleText").GetComponent<Text>().text = data.TotalClimb.ToString("f0") + "M";
tr.Find("Modal/Props/SlopeText").GetComponent<Text>().text = data.AverageGrade.ToString("f1") + "%";
tr.Find("Modal/StartTime").GetComponent<Text>().text = data.StartTime.Value.ToLocalTime().ToString();
//var timegap = data.StartTime.Value.ToLocalTime() - UIManager.Now.GetDateTime();
//if (timegap.Ticks > 0)
//{
// tr.Find("Modal/StartTime").GetComponent<Text>().text = Helper.FormatTicks((int)timegap.Ticks);
//}
var close = tr.Find("Modal/Close").gameObject;
var quit = tr.Find("Modal/Quit").gameObject;
UIManager.AddEvent(close, EventTriggerType.PointerClick, (e) => { tr.gameObject.SetActive(false); });
UIManager.AddEvent(quit, EventTriggerType.PointerClick, (e) => { tr.gameObject.SetActive(false); });
tr.gameObject.SetActive(true);
}
private int RoomId;
public void GetInRoom()
{
var result = ConfigHelper.GameRoomApi.GetDetail(RoomId);
if (result.result)
//1.房间人数已经满了
var max = GameRoom.MaxMembers;
var count = GameRoom.RoomPlayerList.Count;
if (count + 1 > max)
{
App.gameRoomDetail = result.data;
//TODO:一些状态的校验
//1.房间人数已经满了
//2.房间状态不对
//发送TCP信息
MapUDPService.SendJoinGameRoom(App.gameRoomDetail.Id,App.CurrentUser.Id,UIManager.Now.GetDateTime().ToUniversalTime());
UIManager.ShowGameRoomDetailPanel();
Utils.showToast(gameObject, App.GetLocalString("exceeded the maximum number!"));
return;
}
else
//2.房间状态不对
if (GameRoom.Status > 0)
{
Utils.showToast(gameObject, result.errMsg);
Utils.showToast(gameObject, App.GetLocalString("Game has already been processing!"));
return;
}
App.gameRoomDetail = GameRoom;
//发送TCP信息
MapUDPService.SendJoinGameRoom(App.gameRoomDetail.RoomId,App.CurrentUser.Id,UIManager.Now.GetDateTime().ToUniversalTime());
UIManager.ShowGameRoomDetailPanel();
}
public void SelectRoom(GameRoomModel room)
{
GameRoom = room;
RoomId = GameRoom.Id;
RoomId = GameRoom.RoomId;
}
public int GetRoomId()
{
return RoomId;
}
public GameRoomModel GetCurrentRoom()
{
return GameRoom;
}
public void Select(MapRoute map)
{
Map = map;
@@ -607,8 +799,22 @@ public class GameRoomListController : PFUIPanel
//创建房间
private void CreateGameRoom(BaseEventData data)
{
MapList.SetActive(true);
InitStep1();
InitStep2();
next.GetComponent<Image>().color = PFConstants.Dark;
next.transform.Find("Text").GetComponent<Text>().color = PFConstants.LightGrey;
next.GetComponent<Button>().interactable = false;
next.GetComponent<Button>().enabled = false;
HandleStepBtn(previous.name);
HandleCloseTimeBtnClick(0, "");
MapList.SetActive(true);
}
protected override void OnDisable()
{
base.OnDisable();
MapUDPService.MessageListener = null;
}
}
@@ -1,16 +1,19 @@
using Assets.Scenes.Ride.Scripts;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using Assets.Scripts.Scenes.VideoRide;
using DG.Tweening;
using PolyAndCode.UI;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameRoomLoadingController : PFUIPanel
@@ -33,45 +36,89 @@ public class GameRoomLoadingController : PFUIPanel
GameRoom = App.gameRoomDetail;
roomName.text = GameRoom.Name;
routeName.text = GameRoom.MapRouteName;
idtext.text = GameRoom.Id.ToString().PadLeft(7, '0');
idtext.text = GameRoom.RoomId.ToString().PadLeft(7, '0');
distanceText.text = GameRoom.Distance.ToString("f1") + "KM";
gradeText.text = GameRoom.AverageGrade.ToString("f1") + "%";
totalClimbText.text = GameRoom.TotalClimb.ToString("f0")+"M";
totalClimbText.text = GameRoom.TotalClimb.ToString("f0") + "M";
DrawMapRouteAsync(GameRoom.MapRouteId);
prefab = Resources.Load<GameObject>("UI/Prefab/GameRoom/LoadingItem");
MapUDPService.MessageListener = ListenerHandler;
videoLoading = FindObjectOfType<VideoLoading>();
playerLoading = FindObjectOfType<LoadingController>();
videoManager = FindObjectOfType<VideoGameManager>();
videoManager?.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.GameRoom);
}
private bool DataSourceChanged { get; set; }
private void ListenerHandler(List<ReceiveMsgModel> message)
{
try
{
//查询列表
var roomList = message.Where(c => c.RoomList != null).FirstOrDefault();
if (roomList != null)
{
var room = App.gameRoomDetail;
GameRoom = roomList.RoomList.Where(c=>c.RoomId == GameRoom.RoomId).FirstOrDefault();
DataSourceChanged = true;
}
}
catch (Exception e)
{
}
}
float timer = 1f;
VideoLoading videoLoading { get; set; }
LoadingController playerLoading { get; set; }
VideoGameManager videoManager { get; set; }
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
//获取当前进度
var currentScene = SceneManager.GetActiveScene();
double process = 100d;
if (!currentScene.name.Equals("VideoPlay"))
{
process = playerLoading.GetProcess();
}
//发送当前进度
MapUDPService.SendGameRoomLoadingProcess(GameRoom.Id, App.CurrentUser.Id, 56);
MapUDPService.SendGameRoomLoadingProcess(GameRoom.RoomId, App.CurrentUser.Id, process);
timer += 1f;
}
if (DataSourceChanged)
{
DataSourceChanged = false;
//新增
var list = MapUDPService.GetGameRoomList(GameRoom.Id);
var list = GameRoom.RoomPlayerList;
var items = FindObjectsOfType<GameRoomLoadingItem>();
foreach (var item in list)
{
var roomDetail = items.Where(c => c.UserId == item.RoomDetail.UserId).FirstOrDefault();
var roomDetail = items.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (roomDetail == null)
{
var detail = Instantiate(prefab, content);
roomDetail = detail.GetComponent<GameRoomLoadingItem>();
roomDetail.Init(item.Id,item.Name,item.Room.Id,0);
roomDetail.Init(item.UserId, item.WxHeadImage, item.RoomId, item.Process);
}
}
//判断是否进入骑行场景
var startTime = MapUDPService.GetRoomStartTime(GameRoom.Id);
var startTime = GameRoom.StartTime;
var singleUi = FindObjectOfType<SingleUIManager>();
if (startTime.HasValue)
{
var v = FindObjectOfType<VideoLoading>();
v.StartRide(null);
//TODO:倒计时
var dateTime = UIManager.Now.GetDateTime();
var gap = startTime.Value.ToLocalTime() - dateTime;
var interval = (int)Math.Floor(gap.TotalSeconds);
playerLoading?.StartRide(interval);
singleUi?.StartRide(interval);
videoLoading?.StartRide(interval);
transform.parent.gameObject.SetActive(false);
}
timer += 1f;
}
}
+32
View File
@@ -123,6 +123,14 @@ public class UIManager : MonoBehaviour
return this.GetPanelInstance("GameRoomLoadingPanel", ref this.mGameRoomLoadingController);
}
}
private GameRoomCountDownController mGameRoomCountDownController;
public GameRoomCountDownController GameRoomCountDownPanel
{
get
{
return this.GetPanelInstance("GameRoomCountDown", ref this.mGameRoomCountDownController);
}
}
private SettingContoller mSettingContoller;
public SettingContoller SettingModal
{
@@ -863,10 +871,12 @@ public class UIManager : MonoBehaviour
public static void ShowGameRoomListPanel()
{
App.Model = "GameRoom";
UIManager.Show(UIManager.Instance.GameRoomListPanel, UIManager.Instance.MainPanel);
}
public static void ShowGameRoomDetailPanel()
{
App.Model = "GameRoom";
UIManager.Show(UIManager.Instance.GameRoomDetailPanel, UIManager.Instance.MainPanel);
}
//显示房间loading页面
@@ -874,6 +884,14 @@ public class UIManager : MonoBehaviour
{
UIManager.Show(UIManager.Instance.GameRoomLoadingPanel, null, true);
}
public static void ShowGameRoomCountDownPanel(int seconds,Action action)
{
if (UIManager.Instance.GameRoomCountDownPanel!= null)
{
UIManager.Instance.GameRoomCountDownPanel.Init(seconds, action);
}
UIManager.Show(UIManager.Instance.GameRoomCountDownPanel, null, true);
}
public static void ShowDevicePanel()
{
UIManager.Show(UIManager.Instance.DevicePanel, null, true);
@@ -979,10 +997,24 @@ public class UIManager : MonoBehaviour
stack.Pop();
}
}
private static List<Action<string>> BackHandlerList { get; set; }
public static void AddBackHandler(Action<string> callback)
{
if (BackHandlerList == null)
{
BackHandlerList = new List<Action<string>>();
}
BackHandlerList.Add(callback);
}
public static void ShowPrePanel()
{
stack.Pop();
var panel = stack.Pop();
BackHandlerList?.ForEach((e) =>
{
e?.Invoke(panel?.name);
});
if (panel == null)
{
if (App.pageName == "map")