Beispiel #1
0
    public void Move()
    {
        if (bJumpFlag)
        {
            return;
        }
        FPVector   groundNormal = FPVector.zero;
        RaycastHit hitInfo;

        if (!RayGroundInfo(out hitInfo))
        {
            if (!bJumpFlag)
            {
                bMoveFlag = false;
            }
            return;  //如果离地,直接返回
        }
        else
        {
            groundNormal = new FPVector(hitInfo.normal.x, hitInfo.normal.y, hitInfo.normal.z);
        }

        if (!bMoveFlag)
        {
            bMoveFlag = true;
        }
        FPVector forward  = _ufpTransform.forward;
        FPVector fpNormal = _ufpTransform.ChangeVec3ToTSVec(hitInfo.normal);

        RaycastHit barrierInfo;
        bool       bExitBarrier = (RayBarrierInfo(_childObj.forward.ToVector(), out barrierInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物
        bool       bSlope       = false;                                                           //默认不是为斜坡标志

        if (bExitBarrier)
        {
            hitInfo = barrierInfo;
            bSlope  = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false;

            if (ForWardMode == E_ForWardMode.FM_ON_FORWARD)
            {
                forward = _ufpTransform.forward;
            }
            else
            {
                FP angle = 0;
                fpNormal = _ufpTransform.ChangeVec3ToTSVec(hitInfo.normal);
                if (groundNormal != FPVector.zero)
                {
                    angle = FPVector.Angle(groundNormal, fpNormal);
                    angle = -angle;
                }

                if (_childObj)
                {
                    //Vector3 newCrossVec3 = Vector3.Cross(hitInfo.normal, transform.up);
                    //forward = Quaternion.AngleAxis(angle, newCrossVec3) * (transform.forward);
                    FPVector newCrossVec3 = FPVector.Cross(fpNormal, _ufpTransform.up);
                    forward = FPQuaternion.AngleAxis(angle, newCrossVec3) * _ufpTransform.forward;
                }
            }
        }
        else
        {
            bSlope = ((FPVector.Angle(FPVector.up, fpNormal)) > SlopeAngle) ? true : false;
        }

        if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND)   //非跨面模式:供人型和乌贼模式下使用
        {
            if (bExitBarrier && bSlope)
            {
                return;
            }
        }
        else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用
        {
            if (bSlope)
            {
                MotionMode = E_MotionMode.MM_ON_LINE;
                bool flag = CanMoveByInk(ref hitInfo);  //上墙后到边角的处理 ==>TODO
                flag = true;
                if (!flag)
                {
                    FPVector position        = _ufpTransform.ChangeVec3ToTSVec(hitInfo.point) + (_childObj.forward * MoveSpeed * 0.1f);
                    FPVector currentPosition = _ufpTransform.position;
                    //_ufpTransform.position = position;
                    //transform.position     = position.ToVector();
                    UpdatePosition(_ufpTransform.position);
                    RayGroundInfo(out barrierInfo);
                    flag = CanMoveByInk(ref barrierInfo);
                    // transform.position = currentPosition.ToVector();
                    UpdatePosition(_ufpTransform.position);
                    if (bExitBarrier || !flag)
                    {
                        return;
                    }
                }
            }
        }
        if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_NORMAL)
        {
            FitSurfaceParent(forward, _ufpTransform.ChangeVec3ToTSVec(hitInfo.point), fpNormal);  //调整贴面
        }
        else if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_FORWARD)
        {
            if (transform.up != Vector3.up)
            {
                FP           quaternionSpeed = 0.09f;
                FPQuaternion data            = new FPQuaternion(0, _ufpTransform.rotation.y, 0, _ufpTransform.rotation.w);
                _ufpTransform.SetRotation(FPQuaternion.Slerp(_ufpTransform.rotation, data, quaternionSpeed));
            }
        }
        if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走
        {
            _destRoundData = RotationSpeed * MoveSpeed * FrameSyncManager.DeltaTime;
            _ufpTransform.RotateAround(_center, _ufpTransform.up, _destRoundData);
            //_destUfpTransform.position = _ufpTransform.position;
            //_destUfpTransform.rotation = _ufpTransform.rotation;
            //_destUfpTransform.RotateAround(_center, _ufpTransform.up, _destRoundData);

            Debug.Log("----------------->_characterMotion:::" + _destRoundData + ",_destRoundData::" + _destRoundData.AsFloat()
                      + ",childObj.forward::" + _childObj.forward + ",childObj.forward.toVector3::" + _childObj.forward.ToVector());
        }
        else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走
        {
            _destVector = _childObj.forward * MoveSpeed * FrameSyncManager.DeltaTime;
            _ufpTransform.Translate(_destVector, Space.World);
            //_destUfpTransform.position = _ufpTransform.position;
            //_destUfpTransform.rotation = _ufpTransform.rotation;
            //_destUfpTransform.Translate(_destVector, Space.World);
        }

        // if (Physics.Raycast(RayPointObj.position + (_destUfpTransform.position - _ufpTransform.position).ToVector(), -transform.up, GroundRayLength))
        if (Physics.Raycast(RayPointObj.position + (_ufpTransform.position.ToVector() - transform.position), -transform.up, GroundRayLength))
        {
            _bHasSpeed = false;
        }
        else
        {
            _bHasSpeed = true;
            RenderEndUpdatePosition();
        }
        _verCurSpeed = MoveSpeed / 2;
    }
Beispiel #2
0
    public void Move()
    {
        if (!bOnGround)
        {
            bMoveFlag = false;
            return; //如果离地,直接返回
        }
        if (!bMoveFlag)
        {
            bMoveFlag = true;
        }
        Vector3 forward = transform.forward;

        RaycastHit hitInfo;
        bool       bExitBarrier = (RayBarrierInfo(transform.forward, out hitInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物
        bool       bSlope       = false;                                            //默认不是为斜坡标志

        if (bExitBarrier)
        {
            bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false;

            if (ForWardMode == E_ForWardMode.FM_ON_FORWARD)
            {
                forward = transform.forward;
            }
            else
            {
                // //Vector3 dd = forward;
                // // float angle = 90 - Vector3.Angle(transform.up, hitInfo.normal);
                // // angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1;
                // //forward = Quaternion.AngleAxis(angle, transform.right) * transform.up;
                // //Debug.Log("transform.forward::"+transform.forward);
                // Vector3 beforeForward = forward;
                // float angle = 90 - Vector3.Angle(Vector3.up, hitInfo.normal);
                // Vector3 CrossData = Vector3.Cross(Vector3.up, hitInfo.normal);
                // Vector3 WallNormal = Quaternion.AngleAxis(Mathf.Abs(angle), CrossData) * hitInfo.normal;
                // //     Debug.Log("Angle:::" + angle+ ",WallNornal::"+ WallNormal+ ",transform.forward::" + transform.forward);
                // // forward = Quaternion.AngleAxis(angle, normal) * transform.up;
                //// Debug.Log("WallNormal:::"+ WallNormal);
                ///* float*/ angle = 180 - Vector3.Angle(transform.forward, WallNormal);
                // Vector3 normal = Vector3.Cross(transform.forward, WallNormal).y < 0 ? -WallNormal : WallNormal;
                // forward = Quaternion.AngleAxis(angle, normal) * transform.up;


                //  angle = 90 - Vector3.Angle(transform.up, hitInfo.normal);
                //  angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1;
                //  forward = Quaternion.AngleAxis(angle, transform.right) * forward;
                // Debug.DrawRay(transform.position, forward * 3f, Color.yellow);
                // Debug.Log("forward::"+ forward + ",before::"+ beforeForward);
                // //  angle *= Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -1 : 1;
                // //  forward = Quaternion.AngleAxis(angle, transform.right) * forward;

                // //  Debug.Log("forward:::"+ forward +":angle::"+ angle + "Vector3.Cross(transform.forward, WallNormal)::"+ Vector3.Cross(transform.forward, WallNormal));

                float   angle     = 90 - Vector3.Angle(Vector3.up, hitInfo.normal);
                Vector3 CrossData = Vector3.Cross(Vector3.up, hitInfo.normal);
                forward = Quaternion.AngleAxis(angle, transform.right) * transform.up;
                Vector3 WallNormal = Quaternion.AngleAxis(Mathf.Abs(angle), CrossData) * hitInfo.normal;
                //     Debug.Log("Angle:::" + angle+ ",WallNornal::"+ WallNormal+ ",transform.forward::" + transform.forward);
                // forward = Quaternion.AngleAxis(angle, normal) * transform.up;
                // Debug.Log("WallNormal:::"+ WallNormal);
                angle = 180 - Vector3.Angle(transform.forward, WallNormal);
                Vector3 normal = Vector3.Cross(transform.forward, WallNormal).y < 0 ? -WallNormal : WallNormal;
                forward = Quaternion.AngleAxis(angle, normal) * forward;

                Debug.Log("dddddddddddddddddddddddddddddddd::" + angle);
                //Vector3 climbForward = Vector3.zero;
                //float tempAngle = Vector3.Angle(Vector3.up, hitInfo.normal);
                //float angle = 180 - Vector3.Angle(transform.forward, hitInfo.normal) - tempAngle;
                //Vector3 normal = Vector3.Cross(transform.forward, hitInfo.normal).y < 0 ? -hitInfo.normal : hitInfo.normal;
                //forward = Quaternion.AngleAxis(angle, normal) * transform.up;
                //Debug.Log("tempAngle::"+ tempAngle + ",angle::"+ angle + ",Vector3.Angle(transform.forward, hitInfo.normal)::"+ Vector3.Angle(transform.forward, hitInfo.normal));
            }
        }
        else
        {
            RayGroundInfo(out hitInfo);
            bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false;
        }

        if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND)   //非跨面模式:供人型和乌贼模式下使用
        {
            if (bExitBarrier && bSlope)
            {
                return;
            }
        }
        else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用
        {
            if (bSlope)
            {
                MotionMode = E_MotionMode.MM_ON_LINE;
            }
        }

        if (hitInfo.transform != null && ForWardMode != E_ForWardMode.FM_ON_FORWARD)
        {
            FitSurface(forward, hitInfo.point, hitInfo.normal);  //调整贴面
        }
        else
        {
            // Debug.Log("hitInfo.transform is null");
        }


        if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走
        {
            transform.RotateAround(_center, transform.up, RotationSpeed * MoveSpeed * Time.deltaTime);
        }
        else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走
        {
            transform.Translate(transform.forward * MoveSpeed * Time.deltaTime, Space.World);
        }

        _verCurSpeed = MoveSpeed;
    }
Beispiel #3
0
    public void Move()
    {
        if (transform.up != new Vector3(0, 1, 0))
        {
            Debug.Log("111111111111111111111");
        }
        if (!bOnGround)
        {
            bMoveFlag = false;
            return;  //如果离地,直接返回
        }
        if (!bMoveFlag)
        {
            bMoveFlag = true;
        }
        Vector3 forward = transform.parent.forward;

        RaycastHit hitInfo;
        bool       bExitBarrier = (RayBarrierInfo(transform.forward, out hitInfo)); //表示前方检测到物体,暂时把检测到的物体都称之为障碍物
        bool       bSlope       = false;                                            //默认不是为斜坡标志

        if (bExitBarrier)
        {
            bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false;

            if (ForWardMode == E_ForWardMode.FM_ON_FORWARD)
            {
                forward = transform.parent.forward;
            }
            else
            {
                float angle = (90 - Vector3.Angle(Vector3.up, hitInfo.normal)) - Vector3.Angle(Vector3.up, transform.up);
                //if (Vector3.Angle(Vector3.up, hitInfo.normal) > 90)
                //{
                //    angle = Vector3.Angle(Vector3.up, hitInfo.normal) - Vector3.Angle(Vector3.up, transform.up);
                //    Debug.Log("Vector3.Angle(Vector3.up, hitInfo.normal)::" + Vector3.Angle(Vector3.up, hitInfo.normal));
                //}


                if (gameObject.transform.parent)
                {
                    int signed = (Vector3.Angle(transform.forward, transform.parent.forward) > 90) ? -1 : 1;
                    forward = Quaternion.AngleAxis(angle * signed, transform.parent.right) * (transform.parent.up * signed);
                }
            }
        }
        else
        {
            RayGroundInfo(out hitInfo);
            bSlope = (Vector3.Angle(Vector3.up, hitInfo.normal) > SlopeAngle) ? true : false;
        }

        if (SurfaceMode == E_SurfaceMode.SM_ON_GROUND)   //非跨面模式:供人型和乌贼模式下使用
        {
            if (bExitBarrier && bSlope)
            {
                return;
            }
        }
        else if (SurfaceMode == E_SurfaceMode.SM_ON_SURFACE) //跨面模式:供乌贼下潜模式下使用
        {
            if (bSlope)
            {
                MotionMode = E_MotionMode.MM_ON_LINE;
            }
        }

        if (hitInfo.transform != null && ForWardMode != E_ForWardMode.FM_ON_FORWARD)
        {
            FitSurfaceParent(forward, hitInfo.point, hitInfo.normal);  //调整贴面
        }
        else if (hitInfo.transform != null && ForWardMode == E_ForWardMode.FM_ON_FORWARD)
        {
            Vector3 num0000 = transform.up;
            Debug.Log("==============00000000000000000000===》transform.up:::" + transform.up);
            if (num0000 != new Vector3(0, 1, 0))
            {
                Debug.Log("sssssssssssssssssssssssssssssssssssssss");
            }
            FitSurfaceParent(forward, hitInfo.point, hitInfo.normal);  //调整贴面
            // Debug.Log("hitInfo.transform is null");
        }


        if (MotionMode == E_MotionMode.MM_ON_ROUND) //画圆模式:按照圆的弧度来行走
        {
            Vector3 num111 = transform.up;
            Debug.Log("==============1111111===》transform.up:::" + transform.up);
            if (num111 != new Vector3(0, 1, 0))
            {
                Debug.Log("sssssssssssssssssssssssssssssssssssssss");
            }

            transform.parent.RotateAround(_center, transform.parent.up, RotationSpeed * MoveSpeed * Time.deltaTime);
            if (num111 == new Vector3(0, 1, 0) && transform.up != new Vector3(0, 1, 0))
            {
                Debug.Log("dddddddddddddddddddddddddddddddddddddddddddddddddddddddd");
            }

            Debug.Log("================1111111=ffddddd》transform.up:::" + transform.up + ",parent::" + transform.parent.up);
        }
        else if (MotionMode == E_MotionMode.MM_ON_LINE)//直走模式:按照其forward的方向行走
        {
            Vector3 num2222 = transform.up;
            Debug.Log("================222222=》transform.up:::" + transform.up);
            if (num2222 != new Vector3(0, 1, 0))
            {
                Debug.Log("sssssssssssssssssssssssssssssssssssssss");
            }
            transform.parent.Translate(transform.forward * MoveSpeed * Time.deltaTime, Space.World);
            //  transform.parent.position = transform.position;
            Debug.Log("================222222=ffddddd》transform.up:::" + transform.up + ",parent::" + transform.parent.up);
        }

        _verCurSpeed = MoveSpeed;
    }