public TargetFollower(TargetDistributor owner)
 {
     distributor   = owner;
     requiredPoint = Vector3.zero;// 默认 是 玩家当前的位置
     requireSlot   = false;
     assignedSlot  = -1;
 }
Exemple #2
0
            public TargetDistributor distributor;          //定义一个分配器

            public TargetFollower(TargetDistributor owner) //目标跟随
            {
                distributor   = owner;                     //将owner赋给分配器
                requiredPoint = Vector3.zero;              //给需求点赋值
                requireSlot   = false;                     //关闭需要位置
                assignedSlot  = -1;                        //给分配位置赋值
            }
        public void FindTarget()
        {
            //we ignore height difference if the target was already seen
            PlayerController target = playerScanner.Detect(transform, m_Target == null);

            if (m_Target == null)
            {
                //we just saw the player for the first time, pick an empty spot to target around them
                if (target != null)
                {
                    m_Controller.animator.SetTrigger(hashSpotted);
                    m_Target = target;
                    TargetDistributor distributor = target.GetComponentInChildren <TargetDistributor>();
                    if (distributor != null)
                    {
                        m_FollowerInstance = distributor.RegisterNewFollower();
                    }
                }
            }
            else
            {
                //we lost the target. But chomper have a special behaviour : they only loose the player scent if they move past their detection range
                //and they didn't see the player for a given time. Not if they move out of their detectionAngle. So we check that this is the case before removing the target
                if (target == null)
                {
                    m_TimerSinceLostTarget += Time.deltaTime;

                    if (m_TimerSinceLostTarget >= timeToStopPursuit)
                    {
                        Vector3 toTarget = m_Target.transform.position - transform.position;

                        if (toTarget.sqrMagnitude > playerScanner.detectionRadius * playerScanner.detectionRadius)
                        {
                            if (m_FollowerInstance != null)
                            {
                                m_FollowerInstance.distributor.UnregisterFollower(m_FollowerInstance);
                            }

                            //the target move out of range, reset the target
                            m_Target = null;
                        }
                    }
                }
                else
                {
                    if (target != m_Target)
                    {
                        if (m_FollowerInstance != null)
                        {
                            m_FollowerInstance.distributor.UnregisterFollower(m_FollowerInstance);
                        }

                        m_Target = target;

                        TargetDistributor distributor = target.GetComponentInChildren <TargetDistributor>();
                        if (distributor != null)
                        {
                            m_FollowerInstance = distributor.RegisterNewFollower();
                        }
                    }

                    m_TimerSinceLostTarget = 0.0f;
                }
            }
        }
        public void FindTarget()
        {
            PlayerController target = playerScanner.Detect(transform, m_Target == null);

            if (m_Target == null)
            {
                if (target != null)
                {
                    m_Controller.animator.SetTrigger(hashSpotted);
                    m_Target = target;
                    TargetDistributor distributor = target.GetComponentInChildren <TargetDistributor>();
                    if (distributor != null)
                    {
                        m_FollowerInstance = distributor.RegisterNewFollower();
                    }
                }
            }
            else
            {
                if (target == null)
                {
                    m_TimerSinceLostTarget += Time.deltaTime;

                    if (m_TimerSinceLostTarget >= timeToStopPursuit)
                    {
                        Vector3 toTarget = m_Target.transform.position - transform.position;

                        if (toTarget.sqrMagnitude > playerScanner.detectionRadius * playerScanner.detectionRadius)
                        {
                            if (m_FollowerInstance != null)
                            {
                                m_FollowerInstance.distributor.UnregisterFollower(m_FollowerInstance);
                            }


                            m_Target = null;
                        }
                    }
                }
                else
                {
                    if (target != m_Target)
                    {
                        if (m_FollowerInstance != null)
                        {
                            m_FollowerInstance.distributor.UnregisterFollower(m_FollowerInstance);
                        }

                        m_Target = target;

                        TargetDistributor distributor = target.GetComponentInChildren <TargetDistributor>();
                        if (distributor != null)
                        {
                            m_FollowerInstance = distributor.RegisterNewFollower();
                        }
                    }

                    m_TimerSinceLostTarget = 0.0f;
                }
            }
        }