protected override void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
 {
     base.UF_OnPlay(tar, tarPos, vecforward);
     m_SinForward     = MathX.UF_DegForward(m_Forward, -90);
     m_DegRateTick    = 0;
     m_OffsetRateTick = 0;
 }
        protected override void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
        {
            if (speed <= 0.01f)
            {
                Debugger.UF_Error("Speed is too samll,play failed!");
                m_IsPlaying = false;
                return;
            }
            vecforward.y = 0;
            m_Forward = vecforward.normalized;

            float len = Vector3.Distance(tarPos, this.position);

            tarPos = len * m_Forward + this.position;

            m_TarPosition = tarPos + tarOffset * m_Forward;
            if (inGround) m_TarPosition.y = 0;

            m_SorPosition = this.position;
            m_Distance = Vector3.Distance(tarPos, this.position);

            m_Duration = m_Distance / speed;
            m_DurationTick = 0;

            lastPosition = this.position;

            //设置角度指向 
            this.euler = new Vector3(0, MathX.UF_EulerAngle(this.position, tarPos).y, 0);
            EffectControl.UF_ResetTailRender(this.gameObject);
        }
 protected void UF_UpdateMoveBack(float dtime)
 {
     if (!m_isMovingBack)
     {
         return;
     }
     if (m_MoveBackDuration <= 0.0001f || ower == null)
     {
         this.UF_Stop();
         return;
     }
     else
     {
         m_MoveBackDurationTick += dtime;
         float   progress = Mathf.Clamp01(m_MoveBackDurationTick / m_MoveBackDuration);
         Vector3 pos      = m_MoveBackSorPositon * (1 - progress) + ower.transform.position * progress;
         this.position = pos;
         //设置角度指向
         this.euler = new Vector3(0, MathX.UF_EulerAngle(this.position, ower.transform.position).y, 0);
         if (progress >= 1)
         {
             this.UF_Stop();
         }
     }
 }
        protected override void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
        {
            if (speed <= 0.01f)
            {
                Debugger.UF_Error("Speed is too samll,play failed!");
                this.UF_Stop();
                return;
            }
            if (m_Target == null)
            {
                this.UF_Stop();
                return;
            }

            m_TimeTick  = 0;
            m_SourcePos = this.position;
            //计算出总时间
            float distance = Vector3.Distance(m_SourcePos, tar.transform.position);

            m_Duration = distance / speed;
            //设置角度指向
            this.euler = new Vector3(0, MathX.UF_EulerAngle(vecforward).y, 0);
            //偏移幅度
            m_trackOffset.x = offset.x * (Random.Range(1, 100) - 50.0f) / 50.0f;
            m_trackOffset.y = offset.y * (Random.Range(1, 50)) / 50.0f;
            m_Target        = tar;
            m_CurTargetPos  = m_Target.transform.position;
            EffectControl.UF_ResetTailRender(this.gameObject);
        }
Exemple #5
0
 public void TurnForward(Vector3 forward)
 {
     if (!isActive)
     {
         return;
     }
     UF_TurnTo(MathX.UF_EulerAngle(forward).y);
 }
Exemple #6
0
 protected override void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
 {
     //this.transform.eulerAngles = MathX.UF_EulerAngle(vecforward);
     //设置角度指向
     if (fixEulerOnPlay)
     {
         this.euler = new Vector3(0, MathX.UF_EulerAngle(vecforward).y, 0);
     }
 }
Exemple #7
0
 protected override void UF_OnStart()
 {
     if (spaceWorld && worldForwardMode)
     {
         //重新计算
         Vector3 fvEuler = MathX.UF_EulerAngle(this.transform.forward);
         m_Source += fvEuler;
         m_Target += fvEuler;
     }
 }
Exemple #8
0
        private void UpdateInput()
        {
            if (maskGraphicTrigger && DeviceInput.UF_Press(0))
            {
                if (uiCamera == null)
                {
                    return;
                }
                //停止复位
                m_IsResumePoint = false;

                if (!m_IsPress)
                {
                    m_SourceDragPos = DeviceInput.UF_DownPosition(0);
                    joyRoot.gameObject.transform.position = uiCamera.ScreenToWorldPoint(m_SourceDragPos);
                    m_IsPress = true;
                    UF_CallDelegateEvent(m_EventJoyPressDown);
                    UF_CallUnityEvent(m_UEventPressDown);
                }
                if (m_IsPress)
                {
                    m_TargetDragPos = DeviceInput.UF_PressPosition(0);
                    float dist   = Vector3.Distance(m_SourceDragPos, m_TargetDragPos);
                    float limitV = limtPointDistance * Screen.width / UIManager.FixedWidth;

                    if (dist > limitV)
                    {
                        m_TargetDragPos = m_SourceDragPos + (m_TargetDragPos - m_SourceDragPos).normalized * limitV;
                    }
                    if (joyPoint != null)
                    {
                        joyPoint.gameObject.transform.position = uiCamera.ScreenToWorldPoint(m_TargetDragPos);
                    }
//					float angle = 0;
                    Vector3 _moveVector = MathX.UF_Foward(m_SourceDragPos, m_TargetDragPos);
                    if (dist > deadZoom)
                    {
                        m_MoveForward = new Vector3(_moveVector.x, gravity, _moveVector.y).normalized;
                        UF_CallDelegateEvent(m_EventJoyPressMove);
                        UF_UpdateRotate(m_MoveForward);
                    }
                }
            }
            else
            {
                if (m_IsPress)
                {
                    m_IsPress = false;
                    UF_ResumePoint(); UF_UpdateRevertRoot();
                    UF_CallDelegateEvent(m_EventJoyPressUp);
                    UF_CallUnityEvent(m_UEventPressUp);
                }
            }
        }
Exemple #9
0
        public void UF_TurnTo(float angle)
        {
            if (!isActive)
            {
                return;
            }
            //计算动态旋转速度
            float angleClamp = MathX.UF_ClampNormalAngle(m_TurnAngle, angle);

            m_TurnAngle = angle;
            isTurning   = true;
        }
Exemple #10
0
        private void UF_UpdateMove()
        {
            if (!isMoving || lockMove)
            {
                return;
            }

            if (MathX.UF_DistanceSquare(m_Avatar.position, m_DirectionPoint) > m_DistanceBounds)
            {
                //重新计算路径点移动向量
                m_MoveForward = (m_DirectionPoint - m_Avatar.position).normalized;
                UF_MoveAvatarPostion(m_MoveForward * speedMove * GTime.RunDeltaTime);
                //判断是否已经超过目标点了
                if (Vector3.Dot(m_MoveForward, m_DirectionPoint - m_Avatar.position) < 0)
                {
                    m_Avatar.position = m_DirectionPoint;
                }
            }
            else
            {
                if (m_ListPathPoints.Count > 0)
                {
                    m_LastDirectionPoint = m_DirectionPoint;
                    m_DirectionPoint     = m_ListPathPoints[0];
                    //计算路径点移动向量
                    m_MoveForward = (m_DirectionPoint - m_Avatar.position).normalized;
                    if (!lockMoveTurn)
                    {
                        UF_TurnTo(m_DirectionPoint);
                    }
                    m_ListPathPoints.RemoveAt(0);
                    //派发路径点变动事件
                    UF_InvokePathPointChange(m_DirectionPoint);
                    //直接执行一次,不需等待下一帧
                    UF_UpdateMove();
                }
                else
                {
                    isMoving       = false;
                    m_FollowOffset = 0.3f;
                    //派发路径点变动事件
                    UF_InvokePathPointChange(m_Avatar.position);
                    UF_InvokePathPointFinish();
                }
            }
            //			更新状态
            if (mLastMoveSate != isMoving)
            {
                //移动状态变更
                mLastMoveSate = isMoving;
                UF_InvokeMoveStateChange(mLastMoveSate);
            }
        }
Exemple #11
0
        //处理网格
        public void OnPopulateMesh()
        {
            float hfwidth = width / 2;

            mesh.Clear();
            s_ListTempUV.Clear();
            s_ListTempVert.Clear();
            s_ListTempIndex.Clear();
            if (m_Positions.Count < 1)
            {
                return;
            }
            for (int k = 0; k < m_Positions.Count - 1; k++)
            {
                var pointA = m_Positions[k];
                var pointB = m_Positions[k + 1];
                if (useWorldSpace)
                {
                    pointA = pointA - this.transform.position;
                    pointB = pointB - this.transform.position;
                }
                var     forward = (pointB - pointA).normalized * hfwidth;
                Vector3 p1      = MathX.UF_RotateForward(forward, -90) + pointA;
                Vector3 p2      = MathX.UF_RotateForward(forward, -90) + pointB;
                Vector3 p3      = MathX.UF_RotateForward(forward, 90) + pointB;
                Vector3 p4      = MathX.UF_RotateForward(forward, 90) + pointA;
                //加入顶点
                s_ListTempVert.Add(p1);
                s_ListTempVert.Add(p2);
                s_ListTempVert.Add(p3);
                s_ListTempVert.Add(p4);
                //加入UV
                s_ListTempUV.Add(new Vector2(1, 0));
                s_ListTempUV.Add(new Vector2(0, 0));
                s_ListTempUV.Add(new Vector2(0, 1));
                s_ListTempUV.Add(new Vector2(1, 1));
                //加入顶点索引
                //0,2,1,0,3,2
                s_ListTempIndex.Add(3 + k * 4);
                s_ListTempIndex.Add(0 + k * 4);
                s_ListTempIndex.Add(2 + k * 4);
                s_ListTempIndex.Add(2 + k * 4);
                s_ListTempIndex.Add(0 + k * 4);
                s_ListTempIndex.Add(1 + k * 4);
            }


            mesh.vertices  = s_ListTempVert.ToArray();
            mesh.uv        = s_ListTempUV.ToArray();
            mesh.triangles = s_ListTempIndex.ToArray();

            meshFilter.mesh = mesh;
        }
Exemple #12
0
 public void UF_TurnTo(Vector3 point)
 {
     if (!isActive)
     {
         return;
     }
     if (m_Avatar == null)
     {
         Debugger.UF_Warn("m_TransAvatar is null TurnToPoint Fial");
         return;
     }
     UF_TurnTo(MathX.UF_EulerAngle(m_Avatar.position, point).y);
 }
Exemple #13
0
 private void UF_UpdateRotate(Vector3 forward)
 {
     if (rotateRange)
     {
         var vAngle = MathX.UF_EulerAngle(forward);
         if (joyRange != null)
         {
             var e = joyRange.transform.localEulerAngles;
             e.z = -vAngle.y;
             joyRange.transform.localEulerAngles = e;
         }
     }
 }
        protected override void UF_UpdateMoveForward(float dtime)
        {
            lastPosition = this.position;
            float offsetVal = offset;

            if (offsetRate > 0)
            {
                m_OffsetRateTick += dtime * offsetRate;
                offsetVal         = Mathf.Min(m_OffsetRateTick, offset);
            }
            m_DegRateTick += degRate * dtime;
            Vector3 offsetPos = m_SinForward * (Mathf.Sin(m_DegRateTick)) * offsetVal;

            this.position += speed * m_Forward * dtime + offsetPos * dtime;
            this.euler     = MathX.UF_EulerAngle(lastPosition, this.position);
        }
        protected override void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
        {
            if (speed <= 0.01f)
            {
                Debugger.UF_Error("Speed is too samll,play failed!");
                m_IsPlaying = false;
                return;
            }
            tarPos.y        = this.position.y;
            useReboundTimes = 0;
            lastPosition    = this.position;
            //设置角度指向
            this.euler = new Vector3(0, MathX.UF_EulerAngle(vecforward).y, 0);

            EffectControl.UF_ResetTailRender(this.gameObject);
        }
Exemple #16
0
        //碰撞
        internal void UF_OnCollisionHit(ControllerColliderHit hit)
        {
            if (!activeTriggerCollision)
            {
                return;
            }

            GameObject hitTarget = hit.gameObject;

            if (hitTarget.tag == DefineTag.Ground)
            {
                return;
            }

            if (!UF_CheckCollisionIntervalTime())
            {
                return;
            }

            //忽略指定层碰撞
            if (hitTarget.tag == DefineTag.Block || hitTarget.tag == DefineTag.Unwalk)
            {
                //碰撞不可走区域
                MessageSystem.UF_GetInstance().UF_Send(DefineEvent.E_AVATAR_BLOCK, m_Avatar, hitTarget, hit.point);
                return;
            }

            //只处理角色间碰撞
            if (m_Avatar.tag != hitTarget.tag)
            {
                //if (!CheckCollisionIntervalTime()) return;
                if (GHelper.UF_CheckStringMask(collisionMask, hitTarget.tag))
                {
                    //推开角色
                    if (hit.collider is CharacterController)
                    {
                        var     targetController = hit.collider as CharacterController;
                        Vector3 pushForward      = MathX.UF_Foward(m_Avatar.position, hit.transform.position);
                        pushForward.y = 0;
                        //Vector3 pushForward = hit.moveDirection;
                        targetController.Move(pushFactor * pushForward.normalized * GTime.RunDeltaTime);
                    }

                    MessageSystem.UF_GetInstance().UF_Send(DefineEvent.E_AVATAR_COLLISION, m_Avatar, hitTarget);
                }
            }
        }
Exemple #17
0
        protected IEnumerator UF_MotionTransPosition(
            Transform target,
            Vector3 vfrom,
            Transform toObj,
            float duration,
            bool ingoreTimeScale,
            float heightOffset,
            bool spaceWorld,
            Vector3 offset,
            bool focusAngle,
            DelegateVoid eventFinish)
        {
            float progress = 0;
            float tickBuff = 0;

            while (progress < 1)
            {
                float delta = ingoreTimeScale ? GTime.RunDeltaTime : GTime.UnscaleDeltaTime;
                tickBuff += delta;
                progress  = Mathf.Clamp01(tickBuff / duration);
                Vector3 current       = progress * (toObj.position + offset) + (1 - progress) * vfrom;
                Vector3 currentOffset = new Vector3(0, heightOffset * Mathf.Sin(Mathf.PI * progress), 0);
                Vector3 lastPositon   = default(Vector3);
                if (spaceWorld)
                {
                    lastPositon     = target.position;
                    target.position = current + currentOffset;
                    if (focusAngle)
                    {
                        target.eulerAngles = MathX.UF_EulerAngle(lastPositon, target.position);
                    }
                }
                else
                {
                    lastPositon          = target.localPosition;
                    target.localPosition = current + currentOffset;
                    if (focusAngle)
                    {
                        target.localEulerAngles = MathX.UF_EulerAngle(lastPositon, target.position);
                    }
                }
                yield return(null);
            }

            GHelper.UF_SafeCallDelegate(eventFinish);
        }
 protected void UF_UpdateRebound(float dtime)
 {
     if (m_isRebounding)
     {
         m_isRebounding = false;
         useReboundTimes++;
         Vector3 normal = UF_GetNormalFormBlock(m_hitTargetPos, lastPosition, m_Forward);
         //求得反射方向
         m_Forward   = m_Forward - 2 * Vector3.Dot(normal, m_Forward) * normal;
         m_Forward.y = 0;
         m_Forward   = m_Forward.normalized;
         //设置角度指向
         this.euler = new Vector3(0, MathX.UF_EulerAngle(m_Forward).y, 0);
         //更新一次Forward避免异常碰撞
         UF_UpdateMoveForward(dtime);
     }
 }
Exemple #19
0
        private void UF_UpdateTurn()
        {
            if (!isTurning || lockTurn)
            {
                return;
            }

            if (Mathf.Abs(m_Avatar.transModel.eulerAngles.y - m_TurnAngle) > m_ClampAngleBounds)
            {
                float _angle = Mathf.SmoothDampAngle(m_Avatar.transModel.eulerAngles.y, m_TurnAngle, ref m_VelocityTurnAngle, speedTurn);
                m_Forward = MathX.UF_DegForward(Vector3.forward, _angle);
                m_Avatar.transModel.eulerAngles = new Vector3(m_Avatar.transModel.eulerAngles.x, _angle, m_Avatar.transModel.eulerAngles.z);
            }
            else
            {
                isTurning           = false;
                m_VelocityTurnAngle = 0;
            }
        }
Exemple #20
0
        private void UF_UpdateFollowMotion()
        {
            if (m_FollowTarget != null)
            {
                if (!m_FollowTarget.activeSelf)
                {
                    m_FollowTarget = null;
                    return;
                }
                float   bounds = m_Avatar.capsule.radius * 0.5f;
                Vector3 tpos   = m_FollowTarget.transform.position;

                if (MathX.UF_Distance(tpos, m_Avatar.position) > (followBounds + bounds + m_FollowOffset))
                {
                    m_FollowOffset = 0;
                    Vector3 targetPoint = tpos + (m_Avatar.position - tpos).normalized * (bounds + followBounds);
                    isMoving = false;
                    UF_AddPathPoint(targetPoint, null);
                }
            }
        }
        protected override void UF_OnRun(float dtime)
        {
            float progress = 0;

            m_TimeTick += dtime;
            if (m_Duration > 0)
            {
                progress = Mathf.Clamp01(m_TimeTick / m_Duration);
            }
            if (m_Target != null)
            {
                Vector3 tarpos = m_Target.transform.position;
                if (!m_Target.activeSelf)
                {
                    tarpos = m_CurTargetPos;
                }
                tarpos.y = m_SourcePos.y;
                Vector3 current       = progress * (tarpos) + (1 - progress) * m_SourcePos;
                float   sinVal        = Mathf.Sin(Mathf.PI * progress);
                Vector3 currentOffset = new Vector3(m_trackOffset.x * sinVal, m_trackOffset.y * sinVal, 0);
                m_LastPos      = this.position;
                m_CurTargetPos = m_Target.transform.position;
                this.position  = current + currentOffset;
                if (focusAngle)
                {
                    this.euler = MathX.UF_EulerAngle(m_LastPos, this.position);
                }
                if ((progress) >= 1f)
                {
                    //this.Stop();
                    UF_OnColliderEnter(m_Target, this.position);
                }
            }
            else
            {
                this.UF_Stop();
            }
        }
Exemple #22
0
 private void UF_updateFollow()
 {
     if (m_Target != null)
     {
         Vector3 targetpos = m_Target.position;
         //				Vector3 camerapos = mTransMainCam.position;
         //				if (!m_bFirstSet)
         //				{
         //					updaePlace();
         //					m_bFirstSet = true;
         //					return;
         //				}
         //				判断,如果对象的位置没有改变才调用此方法
         //				if (!MathX.VectorEquals(m_LastTargetPos,targetpos) || !MathX.VectorEquals(mLastCameraPos,camerapos))
         if (!MathX.UF_VectorEquals(m_LastTargetPos, targetpos))
         {
             UF_updaePlace();
             //					mLastCameraPos = camerapos;
             m_LastTargetPos = targetpos;
         }
         //				updaePlace();
     }
 }
Exemple #23
0
 protected virtual void UF_OnPlay(GameObject tar, Vector3 tarPos, Vector3 vecforward)
 {
     //设置角度指向
     this.euler = new Vector3(0, MathX.UF_EulerAngle(vecforward).y, 0);
 }
Exemple #24
0
        private void UF_UpdateCamera(float smoothVal)
        {
            if (!mTarget || !mActiveTarget)
            {
                mWorldPoint = UF_GetWorldPoint(this.transform.position);
            }
            else
            {
                Vector3 current = this.transform.position;
                Vector3 target  = mTarget.transform.position + targetOffset;
                Vector3 dpos    = target;
                if (smoothVal <= 0)
                {
                    dpos = target;
                }
                else
                {
                    dpos = MathX.UF_SmoothDamp3(current, target, ref mVel, smoothVal);
                }
                if (lockAixsHorizontal)
                {
                    dpos.x = current.x;
                }
                if (lockAixsVertical)
                {
                    dpos.z = current.z;
                }
                desirePos   = dpos;
                mWorldPoint = UF_GetWorldPoint(desirePos);
            }

            hfRealCamWidth = ViewWidth * 0.5f;
            realCamHight   = (ViewHight / Mathf.Sin(Mathf.Deg2Rad * slope));
            hfRealCamHight = realCamHight * 0.5f;

            cornerA    = new Vector3(mWorldPoint.x + hfRealCamWidth, mWorldPoint.y, mWorldPoint.z - hfRealCamHight);
            cornerB    = new Vector3(mWorldPoint.x - hfRealCamWidth, mWorldPoint.y, mWorldPoint.z - hfRealCamHight);
            cornerC    = new Vector3(mWorldPoint.x - hfRealCamWidth, mWorldPoint.y, mWorldPoint.z + hfRealCamHight);
            cornerD    = new Vector3(mWorldPoint.x + hfRealCamWidth, mWorldPoint.y, mWorldPoint.z + hfRealCamHight);
            cornerUp   = new Vector3((cornerA.x + cornerB.x) / 2.0f, mWorldPoint.y, cornerA.z);
            cornerDown = new Vector3((cornerC.x + cornerD.x) / 2.0f, mWorldPoint.y, cornerC.z);

            //得到4个角点
            if (isCheckBorder)
            {
                Vector3 tempDesirePos = desirePos;
                if (!lockAixsHorizontal)
                {
                    if (cornerA.x > boardRange.width)
                    {
                        tempDesirePos.x = boardRange.width - hfRealCamWidth;
                    }
                    else if (cornerB.x < boardRange.x)
                    {
                        tempDesirePos.x = boardRange.x + hfRealCamWidth;
                    }
                }

                if (!lockAixsVertical)
                {
                    if (cornerD.z > boardRange.height)
                    {
                        tempDesirePos.z = boardRange.height - hfRealCamHight;
                    }
                    else if (cornerA.z < boardRange.y)
                    {
                        tempDesirePos.z = boardRange.y + hfRealCamHight;
                    }
                }

                desirePos = tempDesirePos;
            }
        }
Exemple #25
0
        protected IEnumerator UF_MotionPathPoint(
            Transform target,
            List <Vector3> pathPoints,
            float duration,
            bool ingoreTimeScale,
            float heightOffset,
            bool spaceWorld,
            Vector3 offset,
            bool focusAngle,
            DelegateVoid eventFinish)
        {
            if (pathPoints.Count == 1)
            {
                target.position = pathPoints[0];
                yield break;
            }
            //计算总长度
            float totalLenght = 0;

            for (int k = 1; k < pathPoints.Count; k++)
            {
                totalLenght += Vector3.Distance(pathPoints[k - 1], pathPoints[k]);
            }
            if (totalLenght <= 0)
            {
                target.position = pathPoints[pathPoints.Count - 1];
                yield break;
            }
            for (int k = 1; k < pathPoints.Count; k++)
            {
                float   progress = 0;
                float   tickBuff = 0;
                Vector3 vfrom    = pathPoints[k];
                Vector3 vto      = pathPoints[k - 1];
                //计算每段的时间片段
                float unitDuration = Vector3.Distance(vfrom, vto) / totalLenght;
                if (unitDuration <= 0)
                {
                    continue;
                }
                while (progress < 1)
                {
                    float delta = ingoreTimeScale ? GTime.RunDeltaTime : GTime.UnscaleDeltaTime;
                    tickBuff += delta;
                    progress  = Mathf.Clamp01(tickBuff / duration);
                    Vector3 current       = progress * (vto + offset) + (1 - progress) * vfrom;
                    Vector3 currentOffset = new Vector3(0, heightOffset * Mathf.Sin(Mathf.PI * progress), 0);
                    Vector3 lastPositon   = default(Vector3);
                    if (spaceWorld)
                    {
                        lastPositon     = target.position;
                        target.position = current + currentOffset;
                        if (focusAngle)
                        {
                            target.eulerAngles = MathX.UF_EulerAngle(lastPositon, target.position);
                        }
                    }
                    else
                    {
                        lastPositon          = target.localPosition;
                        target.localPosition = current + currentOffset;
                        if (focusAngle)
                        {
                            target.localEulerAngles = MathX.UF_EulerAngle(lastPositon, target.position);
                        }
                    }
                    yield return(null);
                }
            }
            GHelper.UF_SafeCallDelegate(eventFinish);
        }