/// <summary> /// 根据不同的距离类型,赛选合适的距离检测信息 /// </summary> /// <param name="target"></param> /// <param name="isGrab"></param> /// <param name="interactions"></param> /// <param name="interactionType"></param> void OnPourAll(GameObject target, bool isGrab, DistanceInteraction[] interactions, InteractionType interactionType, bool defaultInteraction = false) { var interactionPours = interactions.Where(_ => _.distanceData.interactionType == interactionType); interactionPours = DistanceSearch(target, interactionPours, isGrab); foreach (var interaction in interactionPours) { //获取到其他的接收点(All、Pour) var managers = DistanceStorage.GetSendDistaceDataAll(interaction.distanceData, interactionType); //如果没有获取到其他的,则跳过 if (managers.Count == 0) { continue; } //获取到当前已经存在的距离管理端 List <DistanceDataManager> distanceManagers; dataManagers.TryGetValue(target, out distanceManagers); //如果不存在,则实例化新的 if (distanceManagers == null) { distanceManagers = new List <DistanceDataManager>(); } //在当前的距离管理端中,找是否存在的, DistanceDataManager distanceManager = distanceManagers.Count == 0 ? new DistanceDataManager() : distanceManagers.Find(obj => obj.sendData.EqualsObject(interaction.distanceData)) ?? new DistanceDataManager(); distanceManager.sendData = interaction.distanceData; interaction.IsGrab = true; foreach (var item in managers) { distanceManager.AddDistance(interaction.distanceData, item.sendData); } distanceManagers.Add(distanceManager); if (!dataManagers.ContainsKey(target)) { dataManagers.Add(target, distanceManagers); } else { dataManagers[target] = distanceManagers; } } }
/// <summary> /// 发送 /// </summary> /// <param name="target">物体</param> /// <param name="isGrab">是否抓取</param> /// <param name="interactions">距离互动集合</param> void OnSend(GameObject target, bool isGrab, int handIndex, DistanceInteraction[] interactions, bool defaultInteraction = false) { //获取到所有的发送信息 var interactionSends = interactions.Where(_ => _.distanceData.interactionType == InteractionType.Send); //获取到发送集合 interactionSends = DistanceSearch(target, interactionSends, isGrab); foreach (var interaction in interactionSends) { interaction.IsGrab = true; interaction.HandIndex = handIndex; //根据指定key获取到接收点 var managers = DistanceStorage.GetSendDistaceDataKey(interaction); List <DistanceDataManager> distanceManagers; dataManagers.TryGetValue(target, out distanceManagers); if (distanceManagers == null) { distanceManagers = new List <DistanceDataManager>(); } foreach (var item in managers) { if (distanceManagers.Contains(item)) { continue; } distanceManagers.Add(item); } //如果是初始交互,则对接收端筛选一次 if (defaultInteraction) { //var distances = new List<DistanceDataManager>(); //distances.CopyTo(distanceManagers.ToArray()); DistanceDataManager[] distances = new DistanceDataManager[distanceManagers.Count]; for (int i = 0; i < distanceManagers.Count; i++) { distances[i] = new DistanceDataManager { sendData = distanceManagers[i].sendData, Distances = new List <DistanceInteraction>() }; for (int j = 0; j < distanceManagers[i].Distances.Count; j++) { var distance = distanceManagers[i].Distances[j]; if (distance.AutoDetection) { distances[i].AddDistance(distance); } } } if (!dataManagers.ContainsKey(target)) { dataManagers.Add(target, distances.ToList()); } else { dataManagers[target] = distances.ToList(); } } else { if (!dataManagers.ContainsKey(target)) { dataManagers.Add(target, distanceManagers); } else { dataManagers[target] = distanceManagers; } } } }