Merge branch 'dev_lishuo' into dev

# Conflicts:
#	.gitignore
#	Assets/Scenes/Ride/Scripts/SelectPlayerFactory.cs
This commit is contained in:
suntao committed 2021-05-12 10:30:08 +08:00
commit a7ea02f70a
52 files changed
+6329 -2723

No files matched your search

+19 -11
View File
@@ -22,7 +22,7 @@ namespace Assets.Scenes.Ride.Scripts
[SerializeField]
Animator characterAnimator;
AbstractMap map;
protected AbstractMap map;
//AbstractMap map;
#region 动画控制参数
@@ -38,7 +38,7 @@ namespace Assets.Scenes.Ride.Scripts
//public bool isQuit;//true 中途退出 或者到达终点
protected bool isMajor;//是否是主人公
protected MapDataModel mapData;
protected int userId;
//protected int userId;
protected DateTime startTime;//开始骑行时间
protected DateTime endTime;//结束骑行时间
protected double weight;//体重
@@ -59,7 +59,7 @@ namespace Assets.Scenes.Ride.Scripts
protected double totalClimb;
public double TotalClimb { get => totalClimb; }
public int UserId { get => userId; }
public int UserId { set; get; }//{ get => userId; }
public double Speed { get => speed; }
public double Power { get => power; }
public double Cadance { get => cadance; }
@@ -85,6 +85,11 @@ namespace Assets.Scenes.Ride.Scripts
void Update()
{
Excute();
AfterExcute();
}
protected virtual void AfterExcute()
{
}
#region 骑行逻辑
@@ -105,7 +110,7 @@ namespace Assets.Scenes.Ride.Scripts
timer -= Time.deltaTime;
if (timer <= 0)//定时器 一秒执行一次
{
SendTcp();
BeforeRun();
Run();
timer = 1.0f;
}
@@ -126,12 +131,12 @@ namespace Assets.Scenes.Ride.Scripts
}
//开始骑行
if (mainController.isStart)
if (GetStart())
{
//计算累计爬升
if (index > 0)
{
totalClimb = 0;
//计算累计爬升
for (int i = 1; i <= index; i++)
{
var diff = mapData.List[i].Elevation - mapData.List[i - 1].Elevation;
@@ -155,17 +160,22 @@ namespace Assets.Scenes.Ride.Scripts
//数据处理
nextPos = map.GeoToWorldPosition(currentlatlong);//下一个点
nextPos.y += 1.15f;//提高y轴让人物站在地图上面
nextPos.y += 1.35f;//提高y轴让人物站在地图上面
prePos = transform.localPosition;//当前点
thisRotation = transform.localRotation;
//移动动画控制
if (distance > 0)
//if (distance > 0)
{
StartCoroutine(MoveTo());//移动
}
}
}
protected virtual void SendTcp()
//游戏开始开关
protected virtual bool GetStart()
{
return mainController.isStart;
}
protected virtual void BeforeRun()
{
}
@@ -225,8 +235,6 @@ namespace Assets.Scenes.Ride.Scripts
nextSlopeDistance = sumDistance - totalDistance * 1000;
NextSlopeTotalDistance = pointList[nextIndex].Distance;
currentSlopeDistance = CurrentDistance-( totalDistance * 1000 - (sumDistance - pointList[index].Distance));
//人物初始化角度控制
}
public double PreElevation;
public double PreSlope;
@@ -17,6 +17,8 @@ using Assets.Scripts;
using System.Threading.Tasks;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using System.IO;
public class CyclingController : DeviceServiceMonoBase
{
@@ -50,7 +52,7 @@ public class CyclingController : DeviceServiceMonoBase
LoadingController loadingController;
private async Task Login()
{
var result = await new UserApi().Login("13115011550", "laozhong", "");
var result = await new UserApi().Login("15261826280", "123456", "");
App.CurrentUser = result.data;
}
GameObject miniMap;
@@ -77,6 +79,8 @@ public class CyclingController : DeviceServiceMonoBase
{
UIManager.Instance.MainPanel = this.transform.Find("SingleUI/Panel").GetComponent<PFUIPanel>();
UIManager.Instance.ModalsPanel = this.transform.Find("SingleUI/ModalPanel").GetComponent<PFUIPanel>();
onlineUserPrefab = Resources.Load<GameObject>("UI/Prefab/Ride/OnlinePlayer");
miniMapPlayerPrefab = Resources.Load<GameObject>("UI/Prefab/Ride/MiniMapPlayer");
target = transform.Find("Target");
//进入倒计时
singleUIManager = UIObject.GetComponent<SingleUIManager>();
@@ -240,7 +244,75 @@ public class CyclingController : DeviceServiceMonoBase
singleUIManager.ContinueRide();
}
#region
#region TCP相关
public void TcpHandler()
{
if (cyclingController != null)
{
//tcp数据传输
cyclingController.Run(null);
//在线人物或比赛人物渲染
ShowOnlineUsers();
}
}
List<OnlinePlayerController> otherList = new List<OnlinePlayerController>();
GameObject onlineUserPrefab;
GameObject miniMapPlayerPrefab;
private void ShowOnlineUsers()
{
var onlineRiders = cyclingController.riders;
List<OnlinePlayerController> currentOnlineUserList = new List<OnlinePlayerController>();
currentOnlineUserList.AddRange(FindObjectsOfType<OnlinePlayerController>());
//新增或者更新
foreach (var item in onlineRiders)
{
var onlineRider = item as OnlineRiderModel;
var currentUser = currentOnlineUserList.Where(c => c.UserId == item.UserId).FirstOrDefault();
var onlineDistance = onlineRider.EndDistance - onlineRider.PreDistance;
var onlineTotalDistance = onlineRider.EndDistance;
if (currentUser == null)
{
//for (int i = 0; i < 100; i++)
//大地图人物
GameObject otherPlayerObj = (GameObject)Instantiate(onlineUserPrefab, transform);
otherPlayerObj.transform.position = map.GeoToWorldPosition(Along(onlineTotalDistance));
var onlinePlayerController = otherPlayerObj.GetComponent<OnlinePlayerController>();
otherList.Add(onlinePlayerController);
onlinePlayerController.UserId = onlineRider.UserId;
//onlinePlayerController.SetDistance(onlineDistance);
onlinePlayerController.SetTotalDistance(onlineTotalDistance, onlineDistance);
onlinePlayerController.SetHead(onlineRider.WxHeadImg);
//小地图人物
GameObject miniPlayer = (GameObject)Instantiate(miniMapPlayerPrefab, transform);
var miniController = miniPlayer.GetComponent<MiniMapPlayerController>();
miniController.SetController(onlinePlayerController);
EventQueueSystem.QueueEvent(new JoinMessageEvent(onlineRider.NickName, onlineRider.WxHeadImg));
}
else
{
//currentUser.SetDistance(onlineDistance);
currentUser.SetTotalDistance(onlineTotalDistance, onlineDistance);
}
}
////移除
//foreach (var item in currentOnlineUserList)
//{
// var currentItem = onlineRiders.Where(c => c.UserId == item.UserId).FirstOrDefault();
// if (currentItem == null)
// {
// item.RemoveSelf();
// }
//}
}
#endregion
#region 视角切换
public AbstractMap map3d;
public bool Is3dView;
public void ChangeMapImageStyle(GameObject arrowGameObj)
{
@@ -255,6 +327,8 @@ public class CyclingController : DeviceServiceMonoBase
map.Terrain.SetElevationType(ElevationLayerType.TerrainWithElevation);
map.ImageLayer.SetLayerSource(ImagerySourceType.Custom);
map.SetCenterLatitudeLongitude(playerController.Currentlatlong);
//map3d.gameObject.SetActive(true);
//map.gameObject.SetActive(false);
//人物属性变更
var pos = map.GeoToWorldPosition(playerController.Currentlatlong);
playerController.currentPos = pos;
@@ -272,6 +346,8 @@ public class CyclingController : DeviceServiceMonoBase
map.Terrain.ExaggerationFactor = 0f;
map.Terrain.SetElevationType(ElevationLayerType.FlatTerrain);
map.SetCenterLatitudeLongitude(playerController.Currentlatlong);
//map.gameObject.SetActive(true);
//map3d.gameObject.SetActive(false);
//人物属性变更
var pos = map.GeoToWorldPosition(playerController.Currentlatlong);
player.transform.position = pos;
@@ -323,7 +399,7 @@ public class CyclingController : DeviceServiceMonoBase
if (!isPause || DateTime.MinValue == startTime)
{
isStart = true;
startTime = DateTime.Now;
startTime = UIManager.Now.GetDateTime();
}
else
{
@@ -377,7 +453,10 @@ public class CyclingController : DeviceServiceMonoBase
isStart = false;
string recordId = Guid.NewGuid().ToString();
var path = Helper.GetDataDir("MapWorkoutRecords/"+ recordId);
//var path = Helper.GetDataDir("MapWorkoutRecords/"+ recordId);
var path = PFConstants.MapWorkoutRecordFolder + "/" + recordId;
Helper.CreateDirectoryIfNotExsit(path);
string imageFileName = path +"/"+ Guid.NewGuid().ToString() + ".png";
CaptureCamera(Camera.main, new Rect(Screen.width * 0f, Screen.height * 0f, Screen.width * 0.5f, Screen.height * 0.5f), imageFileName);
@@ -392,7 +471,7 @@ public class CyclingController : DeviceServiceMonoBase
var rs = resultPanel.GetComponent<ResultPanelScript>();
rs.InjectController(this);
rs.SetDataSource(cyclingController.recorderData);
cyclingController.recorderData.SaveLocal(cyclingModel, selectParamModel, imageFileName, recordId);
cyclingController.recorderData.SaveWithLocalRecordAysnc(cyclingModel, selectParamModel, imageFileName, recordId, path);
}
protected void CaptureCamera(Camera camera, Rect rect,string fileName)
@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assets.Scenes.Ride.Scripts
{
public class EventDelegate : Singleton<EventDelegate>
{
public EventQueueSystem.EventDelegate<GameEvent> JoyStickUpHandler;
//...其他的全局委托
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 033ce2de076bd6148abe8d18305d9d17
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,147 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
namespace Assets.Scenes.Ride.Scripts
{
public class GameEvent { }
public class EventQueueSystem : MonoSingleton<EventQueueSystem>
{
public delegate void EventDelegate<T>(T e) where T : GameEvent;
private delegate void InternalEventDelegate(GameEvent e);
private Dictionary<Type, InternalEventDelegate> delegates = new Dictionary<Type, InternalEventDelegate>();
private Dictionary<Delegate, InternalEventDelegate> delegateLookup = new Dictionary<Delegate, InternalEventDelegate>();
private Dictionary<InternalEventDelegate, Delegate> delegateLookOnce = new Dictionary<InternalEventDelegate, Delegate>();
private Queue eventQueue = new Queue();
public bool bLimitQueueProcessing = false;
public float limitQueueTime = 1f;
//注册侦听事件(持续)
public static void AddListener<T>(EventDelegate<T> del) where T : GameEvent
{
Instance.AddDelegate(del);
}
//注册侦听事件(一次)
public static void AddListenerOnce<T>(EventDelegate<T> del) where T : GameEvent
{
var result = Instance.AddDelegate(del);
if (result != null)
Instance.delegateLookOnce[result] = del;
}
//判定侦听事件是否存在
public static bool HasListener<T>(EventDelegate<T> del) where T : GameEvent
{
return Instance.delegateLookup.ContainsKey(del);
}
//移除侦听事件
public static void RemoveListener<T>(EventDelegate<T> del) where T : GameEvent
{
if (Instance == null)
return;
if (Instance.delegateLookup.TryGetValue(del, out InternalEventDelegate eventDelegate))
{
if (Instance.delegates.TryGetValue(typeof(T), out InternalEventDelegate temp))
{
temp -= eventDelegate;
if (temp == null)
Instance.delegates.Remove(typeof(T));
else
Instance.delegates[typeof(T)] = temp;
}
Instance.delegateLookup.Remove(del);
}
}
public static void RemoveAll()
{
if (Instance != null)
{
Instance.delegates.Clear();
Instance.delegateLookup.Clear();
Instance.delegateLookOnce.Clear();
}
}
private InternalEventDelegate AddDelegate<T>(EventDelegate<T> del) where T : GameEvent
{
if (delegateLookup.ContainsKey(del))
return null;
void eventDelegate(GameEvent e) => del((T)e);
delegateLookup[del] = eventDelegate;
if (delegates.TryGetValue(typeof(T), out InternalEventDelegate temp))
delegates[typeof(T)] = temp += eventDelegate;
else
delegates[typeof(T)] = eventDelegate;
return eventDelegate;
}
//单个事件触发
private static void TriggerEvent(GameEvent e)
{
var type = e.GetType();
if (Instance.delegates.TryGetValue(type, out InternalEventDelegate eventDelegate))
{
eventDelegate.Invoke(e);
//移除单一侦听
foreach (InternalEventDelegate item in Instance.delegates[type].GetInvocationList())
{
if (Instance.delegateLookOnce.TryGetValue(item, out Delegate temp))
{
Instance.delegates[type] -= item;
if (Instance.delegates[type] == null)
Instance.delegates.Remove(type);
Instance.delegateLookup.Remove(temp);
Instance.delegateLookOnce.Remove(item);
}
}
}
}
//外部调用的推入事件队列接口
public static void QueueEvent(GameEvent e)
{
if (!Instance.delegates.ContainsKey(e.GetType()))
return;
Instance.eventQueue.Enqueue(e);
}
float timer = 0.0f;
//事件队列触发处理
void Update()
{
//float timer = 0.0f;
//while (eventQueue.Count > 0)
//{
// if (bLimitQueueProcessing)
// if (timer > limitQueueTime)
// return;
// var e = eventQueue.Dequeue() as GameEvent;
// TriggerEvent(e);
// if (bLimitQueueProcessing)
// timer += Time.deltaTime;
//}
timer += Time.deltaTime;
while (timer >= 1 && eventQueue.Count > 0)
{
var e = eventQueue.Dequeue() as GameEvent;
TriggerEvent(e);
timer = 0;
}
}
private void OnApplicationQuit()
{
RemoveAll();
eventQueue.Clear();
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c7adca7a71f7c6f4f91c5b09695140af
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+4 -5
View File
@@ -16,14 +16,13 @@ namespace Assets.Scenes.Ride.Scripts
{
public class Helper
{
public static string GetDataDir(string pathName)
public static string CreateDirectoryIfNotExsit(string path)
{
var dirName = Application.dataPath + "/" + pathName;
if (!Directory.Exists(dirName))
if (!Directory.Exists(path))
{
Directory.CreateDirectory(dirName);
Directory.CreateDirectory(path);
}
return dirName;
return path;
}
public static void DelectDir(string srcPath)
@@ -0,0 +1,76 @@
using Assets.Scripts;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
namespace Assets.Scenes.Ride.Scripts
{
public class MessagePanelScript : MonoBehaviour
{
CanvasGroup canvas;
Text text;
RawImage head;
string Name ="";
string url ="";
bool run = false;
private void Awake()
{
canvas = transform.GetComponent<CanvasGroup>();
EventQueueSystem.AddListener<JoinMessageEvent>(JoinHandler);
text = transform.Find("Name").GetComponent<Text>();
head = transform.Find("RawImage").GetComponent<RawImage>();
}
private void JoinHandler(JoinMessageEvent e)
{
Name = e.name;
url = e.url;
}
float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
if (timer <= 0)//定时器 一秒执行一次
{
if (!string.IsNullOrEmpty(Name))
{
text.text = Name;
canvas.alpha = 1;
Name = string.Empty;
}
else
{
canvas.DOFade(0, 1);
}
if (!string.IsNullOrEmpty(url))
{
Utils.DisplayImage(head, url, false);
url = string.Empty;
}
//dic.
//foreach (var item in dic)
//{
// text.text = item.Key;
// Utils.DisplayImage(head, item.Value, true);
// dic.Remove(item.Key);
// break;
//}
timer = 1.0f;
}
}
}
public class JoinMessageEvent : GameEvent
{
public string name;//人物名称
public string url;//头像地址
public JoinMessageEvent(string name,string url)
{
this.name = name;
this.url = url;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 811cf43645936ee4da7d950ad83b55a0
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -18,13 +18,13 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
{
//rankings = service.GetMapRecordRankingsFromServe(param.RankingsId);
riders = new List<BaseRider>();
riders.Add(new OnlineRiderModel()
{
NickName = App.CurrentUser.Nickname,
UserId = App.CurrentUser.Id,
WxHeadImg = App.CurrentUser.WxHeadImg,
Point = new GeoJSON.Net.Geometry.GeographicPosition(this.route.RouteInstance.Point[0], this.route.RouteInstance.Point[1])
});
//riders.Add(new OnlineRiderModel()
//{
// NickName = App.CurrentUser.Nickname,
// UserId = App.CurrentUser.Id,
// WxHeadImg = App.CurrentUser.WxHeadImg,
// Point = new GeoJSON.Net.Geometry.GeographicPosition(this.route.RouteInstance.Point[0], this.route.RouteInstance.Point[1])
//});
//foreach (var item in rankings)
//{
// riders.Add(new ReviewRiderModel()
@@ -63,7 +63,8 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
public override void Run(TargetData targetData)
{
#region 获取当前路线在线用户
riders.RemoveAll(r => r.IsSelf == false);
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id).Where(d => d.IsSelf == false)
.ToList();
@@ -79,7 +80,9 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
PreDistance = item.PreDistance,
});
}
#endregion
base.Run(targetData);
}
}
@@ -48,23 +48,23 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
recorderData.PreDistance = recorderData.EndDistance;
riders = new List<BaseRider>();
var rider = new OnlineRiderModel()
{
NickName = App.CurrentUser.Nickname,
UserId = App.CurrentUser.Id,
WxHeadImg = App.CurrentUser.WxHeadImg + "?t=1",
//Point = new GeoJSON.Net.Geometry.GeographicPosition(this.route.RouteInstance.Point[0], this.route.RouteInstance.Point[1]),
EndDistance = recorderData.EndDistance
};
rider.Point = _turfHelper.Along(rider.EndDistance);
//var rider = new OnlineRiderModel()
//{
// NickName = App.CurrentUser.Nickname,
// UserId = App.CurrentUser.Id,
// WxHeadImg = App.CurrentUser.WxHeadImg + "?t=1",
// //Point = new GeoJSON.Net.Geometry.GeographicPosition(this.route.RouteInstance.Point[0], this.route.RouteInstance.Point[1]),
// EndDistance = recorderData.EndDistance
//};
//rider.Point = _turfHelper.Along(rider.EndDistance);
riders.Add(rider);
//riders.Add(rider);
}
public override void Run(TargetData targetData)
{
#region 获取在线用户
#region 获取当前路线在线用户
riders.RemoveAll(r => r.IsSelf == false);
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id).Where(d => d.IsSelf == false)
.ToList();
@@ -80,6 +80,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
PreDistance = item.PreDistance,
});
}
#endregion
base.Run(targetData);
}
@@ -1,4 +1,5 @@
using Assets.Scripts.Apis;
using Assets.Scripts;
using Assets.Scripts.Apis;
using Assets.Scripts.Apis.Models;
using Newtonsoft.Json;
using System;
@@ -106,7 +107,7 @@ namespace Assets.Scenes.Ride.Scripts.Model
public int GlobalCyclingId { get; set; }
public void SaveLocal(CyclingModel cyclingModel, RouteResultParam selectParam, string imageName,string recordId)
public void SaveWithLocalRecordAysnc(CyclingModel cyclingModel, RouteResultParam selectParam, string imageName,string recordId,string path)
{
Dictionary<MapInterruptRecord, List<string>> recordData = new Dictionary<MapInterruptRecord, List<string>>();
if (RiderDatas.Count <= 0)
@@ -181,7 +182,9 @@ namespace Assets.Scenes.Ride.Scripts.Model
interruptRecord.MaxHeartRate = RiderDatas.Max(a => a._HeartRate.GetValueOrDefault(0));
//service.CreateRecordCyclingData(interruptRecord);
//保存骑行记录txt
var path = Helper.GetDataDir("MapWorkoutRecords" + "/" + interruptRecord.Id);
//var path = Helper.GetDataDir("MapWorkoutRecords" + "/" + interruptRecord.Id);
//var path = PFConstants.MapWorkoutRecordFolder + "/" + interruptRecord.Id;
var fname = path + "/" + newFileName + ".txt";
var files = new List<string>();
using (var fs = new FileInfo(fname).OpenWrite())
@@ -208,18 +211,18 @@ namespace Assets.Scenes.Ride.Scripts.Model
recordData.Add(interruptRecord, files);
SaveDataAysnc(recordData);
SaveDataAysnc(recordData, path);
}
/// <summary>
/// 保存数据
/// </summary>
/// <param name="base64Image"></param>
/// <returns></returns>
public void SaveDataAysnc(Dictionary<MapInterruptRecord, List<string>> data)
public void SaveDataAysnc(Dictionary<MapInterruptRecord, List<string>> data,string path)
{
if (data != null && data.Count > 0)
{
var path = Helper.GetDataDir("MapWorkoutRecords");
//var path = Helper.GetDataDir("MapWorkoutRecords");
Task.Run(() => {
var record = data.FirstOrDefault();
MapInterruptRecordApi service = new MapInterruptRecordApi();
@@ -228,7 +231,6 @@ namespace Assets.Scenes.Ride.Scripts.Model
//删除文件
try
{
path = path + "/" + record.Key.Id;
if (result.result && Directory.Exists(path))
{
Helper.DelectDir(path);
@@ -0,0 +1,66 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace Assets.Scenes.Ride.Scripts
{
public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance = null;
private static readonly object locker = new object();
private static bool bAppQuitting;
public static T Instance
{
get
{
if (bAppQuitting)
{
instance = null;
return instance;
}
lock (locker)
{
if (instance == null)
{
instance = FindObjectOfType<T>();
if (FindObjectsOfType<T>().Length > 1)
{
Debug.LogError("不应该存在多个单例!");
return instance;
}
if (instance == null)
{
var singleton = new GameObject();
instance = singleton.AddComponent<T>();
singleton.name = "(singleton)" + typeof(T);
singleton.hideFlags = HideFlags.None;
DontDestroyOnLoad(singleton);
}
else
DontDestroyOnLoad(instance.gameObject);
}
instance.hideFlags = HideFlags.None;
return instance;
}
}
}
private void Awake()
{
bAppQuitting = false;
}
private void OnDestroy()
{
bAppQuitting = true;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 018a42bd337f3c74789a75cc6973b979
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+34 -6
View File
@@ -1,5 +1,6 @@
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scripts;
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
@@ -23,7 +24,7 @@ namespace Assets.Scenes.Ride.Scripts
private int offset = 8;//显示区域的数量
CyclingController cyclingController;
private void Start()
private void Awake()
{
cyclingController = FindObjectOfType<CyclingController>();
playerController = FindObjectOfType<PlayerController>();
@@ -35,15 +36,33 @@ namespace Assets.Scenes.Ride.Scripts
UIManager.AddEvent(scroll, UnityEngine.EventSystems.EventTriggerType.EndDrag, OnEndDrag);
}
}
bool startMouse = false;
float t =1f;
private void Update()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
if (scroll.GetComponent<ScrollRect>().verticalNormalizedPosition <= 0 ||
scroll.GetComponent<ScrollRect>().verticalNormalizedPosition >= (pageIndex == 0 ? 1.2 : 1))
{
startMouse = true;
}
}
else
{
if (startMouse)
{
startMouse = false;
OnEndDrag(null);
}
}
t -= Time.deltaTime;
while (t < 0)
{
Utils.DestroyChildren(transform);
var nearList = MapUDPService.GetNearRiderData(pageIndex, pageSize, new double[] { playerController.Currentlatlong.x, playerController.Currentlatlong.y });
totalPages = MapUDPService.GetNearRiderCount();
for (int i = 0; i < nearList.Count(); i++)
{
Create(nearList[i]);
@@ -51,20 +70,29 @@ namespace Assets.Scenes.Ride.Scripts
t = 1;
}
}
private int totalPages = 0;
private void OnEndDrag(BaseEventData arg0)
{
var scrollrect = scroll.GetComponent<ScrollRect>();
if (scrollrect.verticalNormalizedPosition <= 0)
{
Debug.Log(scrollrect.verticalNormalizedPosition);
pageIndex++;
var p = pageIndex + 1;
if (p * pageSize <= totalPages)
{
pageIndex++;
}
//RefreshList();
}
if (scrollrect.verticalNormalizedPosition >= 1)
if (scrollrect.verticalNormalizedPosition >= (pageIndex == 0 ? 1.2 : 1))
{
if(pageIndex > 0)
var p = pageIndex - 1;
if (p > 0)
{
pageIndex--;
}
//if (pageIndex > 0)
// pageIndex--;
//RefreshList();
}
}
+4 -2
View File
@@ -22,13 +22,14 @@ namespace Assets.Scenes.Ride.Scripts
}
private double temp = 0;
private int index = -1;
public void AnimateNum(float newScore,double totalDistance,int currentIndex, int digit, string format)
public void AnimateNum(float newScore,double totalDistance,int currentIndex, int digit, string format,Image process)
{
if (currentIndex != index)
{
text.text = string.Format(format, totalDistance);
index = currentIndex;
mOldScore = (float)totalDistance;
mOldScore = 0;
process.fillAmount = 0;
}
else
{
@@ -37,6 +38,7 @@ namespace Assets.Scenes.Ride.Scripts
//if (value != newScore)
{
temp = Math.Round(value, digit);
process.fillAmount = ((float)temp / (float)totalDistance);
//向Text组件赋值
text.text = string.Format(format, temp);
}
@@ -0,0 +1,125 @@
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using ChartAndGraph;
using DG.Tweening;
using System;
using UnityEngine;
using UnityEngine.UI;
using System.Linq;
namespace Assets.Scenes.Ride.Scripts
{
public class OnlinePlayerController : AbstractPlayer
{
public PlayerController _playerController;
RawImage head;
GameObject headPanel;
Image arrowImage;
GameObject reviewInfoPanel;
Transform uiObject;
GraphChartBase graph;
ChartDataSourceScript chartDataSourceScript;
protected override void Init()
{
base.Init();
currentlatlong = mainController.GetCenterCoordinate();
_playerController = FindObjectOfType<PlayerController>();
graph = transform.parent.Find("SingleUI/Panel/GraphChart").GetComponent<GraphChartBase>();
chartDataSourceScript = transform.parent.Find("SingleUI/Panel/GraphChart").GetComponent<ChartDataSourceScript>();
//创建UI
uiObject = transform.parent.Find("SingleUI/Panel/ArrowList");
arrowImage = Instantiate(Resources.Load<Image>("UI/Prefab/Ride/ReviewArrow"), uiObject);
arrowImage.color = new Color(0.1529412f, 0.8745098f, 0.8901961f);
}
protected override bool GetStart()
{
return true;
}
protected override void Compute()
{
currentlatlong = mainController.Along(totalDistance);//下一个坐标
//var currentUser = cyclingExcutor.riders.Where(c => c.UserId == UserId).FirstOrDefault();
//if (currentUser == null)
//{
// RemoveSelf();
//}
}
public void SetDistance(double _distance)
{
}
public void SetTotalDistance(double _totalDistance, double _distance)
{
totalDistance = _totalDistance;
distance = _distance;
}
public int GetCurrentIndex(double endistance,MapDataModel mapDataModel)
{
var pointList = mapDataModel.List;
int onIndex = 0;
var sumDistance = 0D;
for (int i = 0; i < pointList.Count; i++)
{
sumDistance += pointList[i].Distance;
if (endistance * 1000 <= sumDistance)
{
onIndex = i;
break;
}
}
return onIndex;
}
private string headUrl;
public void SetHead(string url )
{
headUrl = url;
}
public void MoveHead(Transform parent)
{
var itemIndex = chartDataSourceScript.GetViewIndex(GetCurrentIndex(TotalDistance, mainController.GetMapData())) + 1;
var m = graph.DataSource.GetPoint("Player 2", itemIndex);
graph.PointToWorldSpace(out Vector3 itemPosition, m.x, m.y, "Player 2");
itemPosition.x -= 12f;
itemPosition.y += 5f;
if (headPanel == null)
{
headPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineHeadPanel"));
headPanel.transform.SetParent(parent);
headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
headPanel.transform.position = itemPosition;
}
if (head == null)
{
head = headPanel.GetComponentInChildren<RawImage>();
if (!string.IsNullOrEmpty(headUrl))
{
Utils.DisplayImage(head, headUrl, true);
}
}
headPanel.transform.DOMove(new Vector3(itemPosition.x, itemPosition.y, 0), 1);
}
public void RemoveSelf()
{
transform.gameObject.Destroy();
headPanel.Destroy();
}
protected override void AfterExcute()
{
((RectTransform)arrowImage.transform).position = Camera.main.WorldToScreenPoint(transform.position);
MoveHead(graph.transform);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 281c3f68a13a427499876dec554c3223
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -16,11 +16,17 @@ namespace Assets.Scenes.Ride.Scripts
GameObject headPanel;
public int tickOffset = 0;
Image arrowImage;
GameObject reviewInfoPanel;
Transform uiObject;
protected override void Init()
{
base.Init();
_playerController = FindObjectOfType<PlayerController>();
tickOffset = mainController.preticks;
//创建UI
uiObject = transform.parent.Find("SingleUI/Panel/ArrowList");
arrowImage = Instantiate(Resources.Load<Image>("UI/Prefab/Ride/ReviewArrow"), uiObject);
}
protected override void Compute()
@@ -60,5 +66,9 @@ namespace Assets.Scenes.Ride.Scripts
}
headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1);
}
protected override void AfterExcute()
{
((RectTransform)arrowImage.transform).position = Camera.main.WorldToScreenPoint(transform.position);
}
}
}
+25 -14
View File
@@ -1,6 +1,9 @@
using UnityEngine;
using Assets.Scenes.Ride.Scripts.Model;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using System.Linq;
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
namespace Assets.Scenes.Ride.Scripts
{
@@ -9,9 +12,11 @@ namespace Assets.Scenes.Ride.Scripts
#region 骑行逻辑
TrailRenderer trail;
protected override void Init()
{
base.Init();
{
base.Init();
totalDistance = mainController.selectParamModel.EndDistance;
currentlatlong = mainController.GetCenterCoordinate();
trail = FindObjectOfType<TrailRenderer>();
@@ -22,28 +27,35 @@ namespace Assets.Scenes.Ride.Scripts
//var color7 = Resources.Load<Material>("UI/Material/color7");
//var Graph2 = Resources.Load<Material>("UI/Material/3dGraph2");
//trail.materials = new Material[] { color7};
trail.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
trail.allowOcclusionWhenDynamic = false;
trail.textureMode = LineTextureMode.Tile;
trail.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
trail.receiveShadows = false;
trail.rayTracingMode = UnityEngine.Experimental.Rendering.RayTracingMode.Off;
}
TargetData targetData;
/// <summary>
/// 计算数据,父类会在此方法后处理动画
/// </summary>
protected override void Compute()
{
{
//计算数据
//speed = mainController.UpDateSpeed();
heartRate = mainController.UpDateHeart()??0;
heartRate = mainController.UpDateHeart() ?? 0;
power = mainController.UpdatePower();
cadance = mainController.UpdateCadence();
weight = App.CurrentUser.Weight;
bicycleWeight = App.CurrentUser.BicycleWeight;
#if UNITY_EDITOR
power = 2000;//测试功率
power = 300;//测试功率
#endif
mainController.TrackResistance(currentSlope * App.rideSetting.sensitivity/100);
mainController.TrackResistance(currentSlope * App.rideSetting.sensitivity / 100);
speed = Helper.CalculateSpeed(elevation, currentSlope, power, weight, bicycleWeight);
distance = mainController.UpdateDistance(speed);
totalDistance += distance;
if (!stopRecord)
{
//记录骑行数据
@@ -61,25 +73,24 @@ namespace Assets.Scenes.Ride.Scripts
_Lon = currentlatlong.y,
_TotalClimb = totalClimb,
};
recorderData.PreDistance = TotalDistance-Distance;
recorderData.PreDistance = TotalDistance - Distance;
recorderData.EndDistance = TotalDistance;
recorderData.RiderDatas.Add(targetData);
}
}
protected override void SendTcp()
{
if (mainController.cyclingController != null)
protected override void BeforeRun()
{
if (mainController != null)
{
mainController.cyclingController.Run(null);
mainController.TcpHandler();
}
}
//上传数据
public override void Upload()
{
mainController.Save(TotalDistance);
//SceneManager.LoadScene("MainScene");
}
#endregion
}
@@ -94,6 +94,7 @@ namespace Assets.Scenes.Ride.Scripts
reviewItemScript.SetDistance(0D);
reviewList.Add(reviewItemScript);
GameObject otherPlayerObj = (GameObject)Instantiate(otherPlayer, transform.parent.parent.parent);
otherPlayerObj.transform.position = cyclingController.map.GeoToWorldPosition(cyclingController.Along(0));
var otherPlayerController = otherPlayerObj.GetComponent<OtherPlayerController>();
otherList.Add(otherPlayerController);
otherPlayerController.record = item.record;
@@ -241,7 +241,7 @@ namespace Assets.Scenes.Ride.Scripts
lineRender.positionCount = feat.Count;
lineRender.SetPositions(feat.ToArray());
lineRender.loop = false;
//lineRender.numCapVertices = 10;
lineRender.numCapVertices = 10;
lineRender.numCornerVertices = 10;
//
lineRender.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
@@ -32,7 +32,7 @@ namespace Assets.Scenes.Ride.Scripts
InputField startValue;
InputField endValue;
private int pageIndex = 0;
private int pageSize = 25;
private int pageSize = 8;
private int totalPages = 0;
private string seachName = string.Empty;
@@ -92,6 +92,26 @@ namespace Assets.Scenes.Ride.Scripts
//startValue.text = _startValue.ToString();
//endValue.text = _endValue.ToString();
}
bool startMouse = false;
private void Update()
{
if (Input.GetAxis("Mouse ScrollWheel") != 0)
{
if (scroll.GetComponent<ScrollRect>().verticalNormalizedPosition <= 0 ||
scroll.GetComponent<ScrollRect>().verticalNormalizedPosition >= (pageIndex == 0 ? 1.2 : 1))
{
startMouse = true;
}
}
else
{
if (startMouse)
{
startMouse = false;
OnEndDrag(null);
}
}
}
private void StartvalueChanged(string input)
{
if (!string.IsNullOrWhiteSpace(input))
@@ -178,7 +198,7 @@ namespace Assets.Scenes.Ride.Scripts
private void Refresh()
{
var list = mapApi.GetRouteRanking(App.RouteIdParam, "1", pageIndex, pageSize, seachName);
var list = mapApi.GetShadowList(App.RouteIdParam, seachName, pageIndex, pageSize);
totalPages = list.data.TotalPages;
var data = list.data.list;//.Where(c => c.WeightKg >= _startValue && c.WeightKg <= _endValue).ToList();
if (_startValue > 0)
@@ -201,14 +221,14 @@ namespace Assets.Scenes.Ride.Scripts
}
private void CreateGameObject(List<MapRouteRanking> list)
{
if (list.Count == 0)
{
noRecord.SetActive(true);
}
else
{
noRecord.SetActive(false);
}
//if (list.Count == 0)
//{
// noRecord.SetActive(true);
//}
//else
//{
// noRecord.SetActive(false);
//}
var parent = transform.Find("Panel/PlayerList/Scroll View/Viewport/Content");
int index = 0;
foreach (var item in list)
@@ -253,12 +273,13 @@ namespace Assets.Scenes.Ride.Scripts
}
seletedPlayerScript.Reset();
}
//TODO BUG
private void OnEndDrag(BaseEventData arg0)
{
var scrollrect = scroll.GetComponent<ScrollRect>();
if (scrollrect.verticalNormalizedPosition <= 0)
{
if (pageIndex < totalPages )
if (pageIndex < totalPages-1 )
{
pageIndex++;
Refresh();
+40 -29
View File
@@ -99,6 +99,7 @@ namespace Assets.Scenes.Ride.Scripts
Image nextSlopeImage;
Image currentSlopeImage;
Image miniMapProcess;
Image currentSlopeProcess;
Text miniMapProcessText;
void Awake()
@@ -124,6 +125,8 @@ namespace Assets.Scenes.Ride.Scripts
currentSlopeText = transform.Find("Panel/CurrentSlopePanel/CurrentSlopeText").GetComponent<Text>();
currentSlopeDistanceText = transform.Find("Panel/CurrentSlopePanel/CurrentSlopeDistance").GetComponent<Text>();
currentSlopeToatalDistanceText = transform.Find("Panel/CurrentSlopePanel/TotalSlopeDistance").GetComponent<Text>();
currentSlopeProcess = transform.Find("Panel/CurrentSlopePanel/Process").GetComponent<Image>();
speedTxt = transform.Find("Panel/ComputerPanel/Speed").GetComponent<Text>();
powerTxt = transform.Find("Panel/PowerPanel/Power").GetComponent<Text>();
timerTxt = transform.Find("Panel/ComputerPanel/Timer").GetComponent<Text>();
@@ -338,7 +341,7 @@ namespace Assets.Scenes.Ride.Scripts
}
else
{
target.transform.eulerAngles.Set(cameraX, cameraY, cameraZ);// = new Vector3(cameraX, cameraY, cameraZ);
target.transform.eulerAngles = new Vector3(cameraX, cameraY, cameraZ);
}
//控制照片移动
((RectTransform)arrow.transform).position = Camera.main.WorldToScreenPoint(target.transform.position);
@@ -395,39 +398,43 @@ namespace Assets.Scenes.Ride.Scripts
//nextSlopeDistanceText.GetComponent<NumberDotween>().AnimateNum((float)playerController.NextSlopeDistance, 0, "-{0}M");
nextSlopeDistanceText.text = $"{Math.Round(playerController.NextSlopeTotalDistance, 0)}M";
currentSlopeText.text = Math.Round(playerController.CurrentSlope, 1).ToString() + "%";
currentSlopeDistanceText.GetComponent<NumberDotween>().AnimateNum((float)playerController.CurrentSlopeDistance, Math.Round(playerController.CurrentDistance, 0), playerController.CurrentIndex, 0, "{0}M");
currentSlopeDistanceText.GetComponent<NumberDotween>().AnimateNum((float)playerController.CurrentDistance - (float)playerController.CurrentSlopeDistance, Math.Round(playerController.CurrentDistance, 0), playerController.CurrentIndex, 0, "{0}M", currentSlopeProcess);
totalClimb.text = Math.Round(playerController.TotalClimb, 0).ToString();
//小地图进度
var process = (float)(playerController.TotalDistance / routeInstance.Distance);
miniMapProcess.fillAmount = process;
miniMapProcessText.text = $"{process*100:f0}%";
//动态改变坡度图片
if (playerController.CurrentSlope >= 1)
{
currentSlopeImage.sprite = uphill1;
}
else if (playerController.CurrentSlope > -1 || playerController.CurrentSlope < 1)
{
currentSlopeImage.sprite = straight;
}
else
{
currentSlopeImage.sprite = downhill1;
}
//下一个坡度
if (playerController.NextSlope >= 1)
{
nextSlopeImage.sprite = uphill1Small;
}
else if (playerController.NextSlope > -1 || playerController.NextSlope < 1)
{
nextSlopeImage.sprite = straightSmall;
}
else
{
nextSlopeImage.sprite = downhill1Small;
}
ChangeSlopeImage();
}
}
private void ChangeSlopeImage()
{
if (playerController.CurrentSlope >= 1)
{
currentSlopeImage.sprite = uphill1;
}
else if (playerController.CurrentSlope > -1 || playerController.CurrentSlope < 1)
{
currentSlopeImage.sprite = straight;
}
else
{
currentSlopeImage.sprite = downhill1;
}
//下一个坡度
if (playerController.NextSlope >= 1)
{
nextSlopeImage.sprite = uphill1Small;
}
else if (playerController.NextSlope > -1 || playerController.NextSlope < 1)
{
nextSlopeImage.sprite = straightSmall;
}
else
{
nextSlopeImage.sprite = downhill1Small;
}
}
//重置游戏
@@ -552,7 +559,11 @@ namespace Assets.Scenes.Ride.Scripts
titlePanel.transform.DOLocalMove(new Vector3(titlePanel.transform.localPosition.x, titlePanel.transform.localPosition.y + isSimple * 200f, titlePanel.transform.localPosition.z), 1);
miniMap.transform.DOLocalMove(new Vector3(miniMap.transform.localPosition.x, miniMap.transform.localPosition.y + isSimple * 260f, miniMap.transform.localPosition.z), 1);
nextSlopePanel.transform.DOLocalMove(new Vector3(nextSlopePanel.transform.localPosition.x, nextSlopePanel.transform.localPosition.y + isSimple * 260f, nextSlopePanel.transform.localPosition.z), 1);
currentSlopePanel.transform.DOLocalMove(new Vector3(currentSlopePanel.transform.localPosition.x, currentSlopePanel.transform.localPosition.y + isSimple * 80f, currentSlopePanel.transform.localPosition.z), 1);
currentSlopePanel.transform.DOLocalMove(new Vector3(currentSlopePanel.transform.localPosition.x, currentSlopePanel.transform.localPosition.y + isSimple * 120f, currentSlopePanel.transform.localPosition.z), 1);
var Scale = isSimple == 1 ? new Vector3(0.7f, 0.7f, 0.7f) : new Vector3(1f, 1f, 1f);
currentSlopePanel.transform.DOScale(Scale, 1);
viewButton.transform.DOLocalMove(new Vector3(viewButton.transform.localPosition.x + isSimple * 200f, viewButton.transform.localPosition.y, viewButton.transform.localPosition.z), 1);
nearByPanel.transform.DOLocalMove(new Vector3(nearByPanel.transform.localPosition.x + isSimple * -330f, nearByPanel.transform.localPosition.y, nearByPanel.transform.localPosition.z), 1).onComplete += () =>
{
@@ -593,7 +604,6 @@ namespace Assets.Scenes.Ride.Scripts
}
}
//挪到人物脚本中处理
void MoveChartMarkPoint()
{
//if (mainController.isStart)
@@ -650,6 +660,7 @@ namespace Assets.Scenes.Ride.Scripts
itemPosition.y += 5f;
item.MoveHead(graph.transform, itemPosition);
}
}
//移动总海拔图范围
private void MoveElevationImage()
+28
View File
@@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assets.Scenes.Ride.Scripts
{
public abstract class Singleton<T> where T : class, new()
{
private static T instance = null;
private static readonly object locker = new object();
public static T Instance
{
get
{
lock (locker)
{
if (instance == null)
instance = new T();
return instance;
}
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 08725ccb95699af4c8a913ea306d889e
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: