Пример #1
0
        /// <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;
                }
            }
        }
Пример #2
0
        /// <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;
                    }
                }
            }
        }