/// <summary> /// 往接收端中添加发送端信息 /// </summary> /// <param name="send"></param> public void AddReceiveDistanced(DistanceData send) { if (Distanced == null) { Distanced = new List <DistanceData>(); } //移除正在交互的 if (Distanceing.Contains(send)) { Distanceing.Remove(send); } if (Distanced.Contains(send)) { return; } Distanced.Add(send); if (maxCount == -1) { return; } maxCount--; }
/// <summary> /// 离开 /// </summary> public void OnExit(DistanceData target) { switch (interactionType) { case InteractionType.Receive: case InteractionType.All: case InteractionType.Pour: if (IsOnly) { OnlyDistance = null; } else { RemoveReceiveDistancing(target); RemoveReceiveDistanced(target); } Interaction.OnDistanceExit(target.Interaction); break; case InteractionType.Send: OnlyDistance = null; Interaction.OnDistanceExit(target.Interaction); break; } }
/// <summary> /// 移入 /// </summary> /// <param name="send"></param> /// <param name="receive"></param> public static void OnEnter(DistanceData send, DistanceData receive) { //在次之前,还需要判断一次,否则一直执行循环查找,会很费资源,这么处理不恰当 if (send.OnlyDistance != null || !receive.OnCheck()) { return; } //Debug.Log("进来-发送端:" + send.Interaction.FeaturesObjectController + " 接收端:" + receive.Interaction.FeaturesObjectController); InteractionDistanceInfo distanceInfo; if (IsContains(send, receive, out distanceInfo)) { distanceInfo.SetDistanceStatus(DistanceStatus.Enter); } else { distanceInfo = new InteractionDistanceInfo(send, receive, DistanceStatus.Enter); DistanceInfos.Add(distanceInfo); } receive.OnEnter(send); send.OnEnter(receive); }
/// <summary> /// 是否存在 /// </summary> /// <param name="send"></param> /// <param name="receive"></param> /// <returns></returns> static bool IsContains(DistanceData send, DistanceData receive, out InteractionDistanceInfo distanceInfo) { var distance = DistanceInfos.Find(obj => obj.sendKey.Equals(send) && obj.receiveValue.Equals(receive)); distanceInfo = distance; return(distance != null); }
/// <summary> /// 停留 /// </summary> public void OnStay(DistanceData target) { if (Interaction == null) { return; } Interaction.OnDistanceStay(target.Interaction); }
/// <summary> /// 根据距离点,获取到指定的发送点 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List <DistanceDataManager> GetSendDistaceDataKey(DistanceData data) { if (dataManagers == null) { return(null); } return(dataManagers.FindAll(obj => obj.sendData.TagID.Equals(data.TagID) && obj.sendData.Interaction.Equals(data.Interaction))); }
/// <summary> /// 根据物体传递传递过来的距离对象,去找到相应的所在管理端 /// </summary> /// <param name="data"></param> /// <returns></returns> public static DistanceDataManager GetSendDistanceManager(DistanceData data) { if (dataManagers == null) { return(null); } return(dataManagers.Find(obj => obj.sendData.EqualsObject(data)));//寻找到一个GUID与TadID一致的对象 }
protected virtual void Awake() { if (OnEnter == null) { OnEnter = new EventDistanceInteraction(); } if (OnStay == null) { OnStay = new EventDistanceInteraction(); } if (OnExit == null) { OnExit = new EventDistanceInteraction(); } if (OnRelease == null) { OnRelease = new EventDistanceInteraction(); } if (OnStatusRelease == null) { OnStatusRelease = new EventDistanceInteractionRelease(); } if (OnNotRelease == null) { OnNotRelease = new UnityEvent(); } //加入时,检索一次 if (distanceData == null) { distanceData = new DistanceData(); } if (ActiveShadow) { AddShadow(); } else { RemoveShadow(); } if (ActiveParent) { AddParent(); } else { RemoveParent(); } }
/// <summary> /// 根据到所有的主动点接收数据,适用Send类型以及All类型(但是不包括本身) /// </summary> /// <param name="data"></param> /// <returns></returns> public static List <DistanceDataManager> GetSendDistaceDataAll(DistanceData data, InteractionType interactionType) { if (dataManagers == null) { return(null); } return(dataManagers.FindAll(obj => obj.sendData.TagID.Equals(data.TagID) && obj.sendData.interactionType.Equals(interactionType) && !obj.sendData.EqualsObject(data))); }
/// <summary> /// 获取接收距离数据 /// </summary> /// <param name="data"></param> /// <returns></returns> public static List <DistanceData> GetReceiveDistanceDatas(DistanceData data) { List <DistanceData> distances = new List <DistanceData>(); var manager = GetSendDistanceManager(data); if (manager != null) { distances = manager.Distances; } return(distances); }
/// <summary> /// 放下,完成 /// </summary> /// <param name="send"></param> /// <param name="receive"></param> public static void OnRelease(DistanceData send, DistanceData receive) { InteractionDistanceInfo distanceInfo; if (IsContains(send, receive, out distanceInfo)) { distanceInfo.SetDistanceStatus(DistanceStatus.Complete); receive.OnRelesae(send); send.OnRelesae(receive); } }
bool OnDistance(DistanceData receiveDistance, DistanceData sendDistance) { switch (receiveDistance.distanceShape) { case DistanceShape.Sphere: return(Utilitys.Distance(receiveDistance.Position, sendDistance.Position, receiveDistance.distanceType) <= receiveDistance.distanceValue); case DistanceShape.Cube: return(Utilitys.CubeDistance(receiveDistance.Position, receiveDistance.Size, sendDistance.Position, receiveDistance.distanceType)); default: return(false); } }
public void RemoveReceiveDistancing(DistanceData send) { if (Distanceing == null) { return; } if (!Distanceing.Contains(send)) { return; } Distanceing.Remove(send); }
/// <summary> /// 往接收端中添加发送距离信息 /// </summary> /// <param name="send"></param> public void AddReceiveDistancing(DistanceData send) { if (Distanceing == null) { Distanceing = new List <DistanceData>(); } if (Distanceing.Contains(send)) { return; } Distanceing.Add(send); }
/// <summary> /// 两者之间是否已经靠近 /// </summary> /// <param name="send"></param> /// <param name="receive"></param> /// <returns></returns> public static bool IsEnter(DistanceData send, DistanceData receive) { InteractionDistanceInfo distanceInfo; IsContains(send, receive, out distanceInfo); if (distanceInfo == null) { return(false); } return(distanceInfo.distanceStatus == DistanceStatus.Enter || distanceInfo.distanceStatus == DistanceStatus.Complete); }
private void Awake() { if (OnEnter == null) { OnEnter = new EventDistanceInteraction(); } if (OnStay == null) { OnStay = new EventDistanceInteraction(); } if (OnExit == null) { OnExit = new EventDistanceInteraction(); } if (OnRelease == null) { OnRelease = new EventDistanceInteraction(); } if (OnNotRelease == null) { OnNotRelease = new UnityEvent(); } //加入时,检索一次 if (distanceData == null) { distanceData = new DistanceData(); } distanceData.Interaction = this; if (FeaturesObjectController == null) { FeaturesObjectController = gameObject.GetComponent <Features.FeaturesObjectController>(); if (FeaturesObjectController == null) { FeaturesObjectController = gameObject.GetComponentInParent <Features.FeaturesObjectController>(); } } }
/// <summary> /// 添加距离数据 /// </summary> /// <param name="data"></param> public static void AddDistanceData(DistanceData data) { if (data == null) { return; } if (AllDistances.Contains(data)) { return; } AllDistances.Add(data); AddDistanceData(dataManagers, data); //校验一次 CheckDistanceData(); }
/// <summary> /// 移出 /// </summary> /// <param name="send"></param> /// <param name="receive"></param> public static void OnExit(DistanceData send, DistanceData receive) { //在次之前,还需要判断一次,否则一直执行循环查找,会很费资源,这么处理不恰当 //To…Do InteractionDistanceInfo distanceInfo; if (IsContains(send, receive, out distanceInfo)) { DistanceInfos.Remove(distanceInfo); receive.OnExit(send); send.OnExit(receive); //Debug.Log("离开了"); } }
public void RemoveReceiveDistanced(DistanceData send) { if (Distanced == null) { return; } if (!Distanced.Contains(send)) { return; } Distanced.Remove(send); if (maxCount != -1) { maxCount++; } }
/// <summary> /// 加入距离 /// </summary> /// <param name="distance"></param> /// <param name="target"></param> public void AddDistance(DistanceData distance, DistanceData target) { if (sendData != distance) { return; } if (distance.interactionType != target.interactionType) { return; } if (Distances.Contains(target)) { return; } Distances.Add(target); }
/// <summary> /// 加入距离 /// </summary> /// <param name="distance"></param> public void AddDistance(DistanceData distance) { switch (distance.interactionType) { case InteractionType.Receive: if (Distances.Any(obj => obj.EqualsObject(distance))) { return; } Distances.Add(distance); break; case InteractionType.Send: case InteractionType.Pour: case InteractionType.All: sendData = distance; break; } }
/// <summary> /// 删除距离数据信息 /// </summary> /// <param name="data"></param> public static void DeleteDistanceData(DistanceData data) { switch (data.interactionType) { case InteractionType.Pour: case InteractionType.All: case InteractionType.Send: if (!IsExistDistanceData(dataManagers, data)) { return; } var manager = GetSendDistanceManager(data); dataManagers.Remove(manager); break; case InteractionType.Receive: //根据这个被动点,获取到所有的主动点信息 var managers = GetSendDistaceDataAll(data, InteractionType.Send); //遍历主动点,然后在去查找主动点中所有的被动点信息,将被动点数据从管理端移除掉 foreach (var item in managers) { var distanceData = item.GetDistanceData(data); item.RemoveDistance(distanceData); } break; default: break; } AllDistances.Remove(data); CheckDistanceData(); //SaveDistanceData();//保存一次就好 }
/// <summary> /// 移入 /// </summary> public void OnEnter(DistanceData target) { //如果已经有物体交互成功了,并且满足了某个条件,则不允许进行交互了 switch (interactionType) { case InteractionType.Receive: case InteractionType.All: case InteractionType.Pour: //将此信息,加入到正在交互中 AddReceiveDistancing(target); Interaction.OnDistanceEnter(target.Interaction); break; case InteractionType.Send: Interaction.OnDistanceEnter(target.Interaction); break; } }
/// <summary> /// 判断主动点对象是否相同 /// </summary> /// <param name="data"></param> /// <returns></returns> public static bool IsExistDistanceData(List <DistanceDataManager> dataManagers, DistanceData data) { if (dataManagers == null) { return(false); } //在集合中是否存在此主动交互点 return(dataManagers.Any(obj => obj.sendData.EqualsObject(data))); }
/// <summary> /// 往发送端中添加接收端信息,一个发送端只能接收一个接收端 /// </summary> /// <param name="receive"></param> public void AddSendDistance(DistanceData receive) { OnlyDistance = receive; }
/// <summary> /// 根据传递过来的具体距离对象,来获取到从内存读取距离信息的对象 /// </summary> /// <param name="data"></param> /// <returns></returns> public DistanceData GetDistanceData(DistanceData data) { return(sendData.EqualsObject(data) ? sendData : Distances.Find(obj => obj.EqualsObject(data))); }
/// <summary> /// 移除距离 /// </summary> /// <param name="distance"></param> public void RemoveDistance(DistanceData distance) { var data = Distances.Find(obj => obj.EqualsObject(distance)); Distances.Remove(data); }
public DistanceDataManager() { sendData = new DistanceData(); Distances = new List <DistanceData>(); Distanceing = new List <DistanceData>(); }
/// <summary> /// 添加距离数据 /// </summary> /// <param name="managers"></param> /// <param name="data"></param> public static void AddDistanceData(List <DistanceDataManager> managers, DistanceData data) { switch (data.interactionType) { //如果是主动点 case InteractionType.Send: if (IsExistDistanceData(managers, data)) { return; } //新增一个主动点管理 DistanceDataManager sendDataManager = new DistanceDataManager(); sendDataManager.AddDistance(data); //添加到距离管理器中 managers.Add(sendDataManager); //遍历下相同的Receive对象,从而来取得相应的对象 var receives = GetReceiveDistanceData(data.TagID); foreach (var item in receives) { sendDataManager.AddDistance(item); } break; case InteractionType.All: case InteractionType.Pour: if (IsExistDistanceData(managers, data)) { return; } //新增一个主动点管理 DistanceDataManager allDataManager = new DistanceDataManager(); allDataManager.AddDistance(data); //添加到距离管理器中 managers.Add(allDataManager); //同时遍历下之前已经相同的TagID以及All,从而来取得联系 break; //如果是被动点 case InteractionType.Receive: //如果要加入的是被动点,去找匹配的主动点是否有,如果没有,则不添加,并且提示警告 //AddReceiveDistance(data); var distanceDatas = managers.FindAll(obj => obj.sendData.TagID.Equals(data.TagID)); foreach (var item in distanceDatas) { item.AddDistance(data); } break; default: //什么都不处理,相当于禁用 break; } }
protected virtual void Awake() { if (OnEnter == null) { OnEnter = new EventDistanceInteraction(); } if (OnStay == null) { OnStay = new EventDistanceInteraction(); } if (OnExit == null) { OnExit = new EventDistanceInteraction(); } if (OnRelease == null) { OnRelease = new EventDistanceInteraction(); } if (OnStatusRelease == null) { OnStatusRelease = new EventDistanceInteractionRelease(); } if (OnNotRelease == null) { OnNotRelease = new UnityEvent(); } //加入时,检索一次 if (distanceData == null) { distanceData = new DistanceData(); } distanceData.Interaction = this; if (FeaturesObjectController == null) { FeaturesObjectController = gameObject.GetComponent <Features.FeaturesObjectController>(); if (FeaturesObjectController == null) { FeaturesObjectController = gameObject.GetComponentInParent <Features.FeaturesObjectController>(); } } if (ActiveShadow) { AddShadow(); } else { RemoveShadow(); } if (ActiveParent) { AddParent(); } else { RemoveParent(); } }