Exemplo n.º 1
0
        /// <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--;
        }
Exemplo n.º 2
0
        /// <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;
            }
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 4
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <summary>
        /// 停留
        /// </summary>
        public void OnStay(DistanceData target)
        {
            if (Interaction == null)
            {
                return;
            }

            Interaction.OnDistanceStay(target.Interaction);
        }
Exemplo n.º 6
0
        /// <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)));
        }
Exemplo n.º 7
0
        /// <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一致的对象
        }
Exemplo n.º 8
0
        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();
            }
        }
Exemplo n.º 9
0
        /// <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)));
        }
Exemplo n.º 10
0
        /// <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);
        }
Exemplo n.º 11
0
        /// <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);
            }
        }
Exemplo n.º 12
0
        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);
            }
        }
Exemplo n.º 13
0
        public void RemoveReceiveDistancing(DistanceData send)
        {
            if (Distanceing == null)
            {
                return;
            }

            if (!Distanceing.Contains(send))
            {
                return;
            }

            Distanceing.Remove(send);
        }
Exemplo n.º 14
0
        /// <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);
        }
Exemplo n.º 15
0
        /// <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);
        }
Exemplo n.º 16
0
        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>();
                }
            }
        }
Exemplo n.º 17
0
        /// <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();
        }
Exemplo n.º 18
0
        /// <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("离开了");
            }
        }
Exemplo n.º 19
0
        public void RemoveReceiveDistanced(DistanceData send)
        {
            if (Distanced == null)
            {
                return;
            }

            if (!Distanced.Contains(send))
            {
                return;
            }

            Distanced.Remove(send);

            if (maxCount != -1)
            {
                maxCount++;
            }
        }
Exemplo n.º 20
0
        /// <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);
        }
Exemplo n.º 21
0
        /// <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;
            }
        }
Exemplo n.º 22
0
        /// <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();//保存一次就好
        }
Exemplo n.º 23
0
        /// <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;
            }
        }
Exemplo n.º 24
0
        /// <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)));
        }
Exemplo n.º 25
0
 /// <summary>
 /// 往发送端中添加接收端信息,一个发送端只能接收一个接收端
 /// </summary>
 /// <param name="receive"></param>
 public void AddSendDistance(DistanceData receive)
 {
     OnlyDistance = receive;
 }
Exemplo n.º 26
0
 /// <summary>
 /// 根据传递过来的具体距离对象,来获取到从内存读取距离信息的对象
 /// </summary>
 /// <param name="data"></param>
 /// <returns></returns>
 public DistanceData GetDistanceData(DistanceData data)
 {
     return(sendData.EqualsObject(data) ? sendData : Distances.Find(obj => obj.EqualsObject(data)));
 }
Exemplo n.º 27
0
        /// <summary>
        /// 移除距离
        /// </summary>
        /// <param name="distance"></param>
        public void RemoveDistance(DistanceData distance)
        {
            var data = Distances.Find(obj => obj.EqualsObject(distance));

            Distances.Remove(data);
        }
Exemplo n.º 28
0
 public DistanceDataManager()
 {
     sendData    = new DistanceData();
     Distances   = new List <DistanceData>();
     Distanceing = new List <DistanceData>();
 }
Exemplo n.º 29
0
        /// <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;
            }
        }
Exemplo n.º 30
0
        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();
            }
        }