static object PerformMemberwiseClone(ref object o)
        {
            var ins = new UnityEngine.AI.OffMeshLinkData();

            ins = (UnityEngine.AI.OffMeshLinkData)o;
            return(ins);
        }
        IEnumerator CheckOffMeshLink()
        {
            do
            {
                //Debug.Log(Vector3.Distance(transform.eulerAngles, desiredRotation.eulerAngles));
                method = OffMeshLinkMoveMethod.Grounded;
                yield return(new WaitForEndOfFrame());
            }while (quickTurn);

            yield return(new WaitForEndOfFrame());

            UnityEngine.AI.OffMeshLinkData data     = agent.currentOffMeshLinkData;
            UnityEngine.AI.OffMeshLinkType linkType = data.linkType;
            string offMeshLinkTag = string.Empty;

            if (data.offMeshLink)
            {
                offMeshLinkTag = data.offMeshLink.tag;
            }

            switch (linkType)
            {
            case UnityEngine.AI.OffMeshLinkType.LinkTypeDropDown:
                agent.autoTraverseOffMeshLink = false;
                method = OffMeshLinkMoveMethod.DropDown;
                break;

            case UnityEngine.AI.OffMeshLinkType.LinkTypeJumpAcross:
                agent.autoTraverseOffMeshLink = false;
                method = OffMeshLinkMoveMethod.JumpAcross;
                break;

            case UnityEngine.AI.OffMeshLinkType.LinkTypeManual:
                switch (offMeshLinkTag)
                {
                case "StepUp":
                    agent.autoTraverseOffMeshLink = false;
                    method = OffMeshLinkMoveMethod.Action;
                    break;

                case "JumpOver":
                    agent.autoTraverseOffMeshLink = false;
                    method = OffMeshLinkMoveMethod.Action;
                    break;

                case "ClimbUp":
                    agent.autoTraverseOffMeshLink = false;
                    method = OffMeshLinkMoveMethod.Action;
                    break;

                default:
                    agent.autoTraverseOffMeshLink = false;
                    method = OffMeshLinkMoveMethod.Grounded;
                    break;
                }
                break;
            }
        }
示例#3
0
 //Check if we have a parkour in the plotted path.  (If so, don't dodge because otherwise the agent breaks.)
 public virtual bool HaveOffMeshLinkInPath()
 {
     UnityEngine.AI.OffMeshLinkData linkData = agent.nextOffMeshLinkData;
     //print(linkData.endPos);
     //print(linkData.activated);
     //print(linkData.offMeshLink);
     //print(linkData.valid);
     return(linkData.valid);
 }
示例#4
0
        IEnumerator NormalSpeed(UnityEngine.AI.NavMeshAgent agent)
        {
            UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
            Vector3 endPos = data.endPos + Vector3.up * agent.baseOffset;

            while (agent.transform.position != endPos)
            {
                agent.transform.position = Vector3.MoveTowards(agent.transform.position, endPos, agent.speed * Time.deltaTime);
                yield return(null);
            }
        }
示例#5
0
        IEnumerator Parabola(UnityEngine.AI.NavMeshAgent agent, float jumpHeight, float jumpDuration)
        {
            UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
            Vector3 startPos       = agent.transform.position;
            Vector3 endPos         = data.endPos + Vector3.up * agent.baseOffset;
            float   normalizedTime = 0.0f;

            while (normalizedTime < 1.0f)
            {
                float yOffset = jumpHeight * 4.0f * (normalizedTime - normalizedTime * normalizedTime);
                agent.transform.position = Vector3.Lerp(startPos, endPos, normalizedTime) + yOffset * Vector3.up;
                normalizedTime          += Time.deltaTime / jumpDuration;
                yield return(null);
            }
        }
        static void WriteBackInstance(CSHotFix.Runtime.Enviorment.AppDomain __domain, StackObject *ptr_of_this_method, IList <object> __mStack, ref UnityEngine.AI.OffMeshLinkData instance_of_this_method)
        {
            ptr_of_this_method = ILIntepreter.GetObjectAndResolveReference(ptr_of_this_method);
            switch (ptr_of_this_method->ObjectType)
            {
            case ObjectTypes.Object:
            {
                __mStack[ptr_of_this_method->Value] = instance_of_this_method;
            }
            break;

            case ObjectTypes.FieldReference:
            {
                var ___obj = __mStack[ptr_of_this_method->Value];
                if (___obj is ILTypeInstance)
                {
                    ((ILTypeInstance)___obj)[ptr_of_this_method->ValueLow] = instance_of_this_method;
                }
                else
                {
                    var t = __domain.GetType(___obj.GetType()) as CLRType;
                    t.SetFieldValue(ptr_of_this_method->ValueLow, ref ___obj, instance_of_this_method);
                }
            }
            break;

            case ObjectTypes.StaticFieldReference:
            {
                var t = __domain.GetType(ptr_of_this_method->Value);
                if (t is ILType)
                {
                    ((ILType)t).StaticInstance[ptr_of_this_method->ValueLow] = instance_of_this_method;
                }
                else
                {
                    ((CLRType)t).SetStaticFieldValue(ptr_of_this_method->ValueLow, instance_of_this_method);
                }
            }
            break;

            case ObjectTypes.ArrayReference:
            {
                var instance_of_arrayReference = __mStack[ptr_of_this_method->Value] as UnityEngine.AI.OffMeshLinkData[];
                instance_of_arrayReference[ptr_of_this_method->ValueLow] = instance_of_this_method;
            }
            break;
            }
        }
示例#7
0
        public GameObject CheckActionObject()
        {
            GameObject _object = null;

            RaycastHit hitInfoAction;
            Vector3    yOffSet = new Vector3(0f, actionRayHeight, 0f);

            UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
            Ray ray = new Ray(transform.position + yOffSet, new Vector3(data.endPos.x, transform.position.y, data.endPos.z) - transform.position);

            //Debug.DrawRay(transform.position + yOffSet, ray.direction*distanceOfRayActionTrigger, Color.blue, 0.1f);
            if (Physics.Raycast(ray, out hitInfoAction, distanceOfRayActionTrigger, actionLayer))
            {
                _object = hitInfoAction.transform.gameObject;
            }

            return(_object);
        }
        IEnumerator NormalSpeed(UnityEngine.AI.NavMeshAgent agent)
        {
            UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
            Vector3 endPos = data.endPos + Vector3.up * agent.baseOffset;

            while (agent.transform.position != endPos)
            {
                //Debug.DrawLine(transform.position, endPos, Color.red);
                transform.position = Vector3.MoveTowards(transform.position, endPos, 6f * Time.deltaTime);
                agent.enabled      = false;
                yield return(new WaitForEndOfFrame());
            }
            if (agent.enabled && !agent.autoTraverseOffMeshLink)
            {
                agent.CompleteOffMeshLink();
            }
            agent.enabled = true;
        }
 private void DoGetOffMeshLinkData()
 {
     UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
     if (!activated.IsNone)
     {
         activated.Value = data.activated;
     }
     if (!endPos.IsNone)
     {
         endPos.Value = data.endPos;
     }
     if (!linkType.IsNone)
     {
         linkType.Value = data.linkType.ToString();
     }
     if (!startPos.IsNone)
     {
         startPos.Value = data.startPos;
     }
     if (!valid.IsNone)
     {
         valid.Value = data.valid;
     }
 }
示例#10
0
        void OnAnimatorMove()
        {
            actions = baseLayerInfo.IsTag("CustomAction") || lockMovement;

            if (Time.timeScale == 0 || agent == null)
            {
                return;
            }
            if (agent.enabled && !agent.isOnOffMeshLink && agent.updatePosition)
            {
                Vector3 velocity = animator.deltaPosition / Time.deltaTime;
                if (!velocity.IsVectorNaN())
                {
                    agent.velocity = velocity;
                }
                else
                {
                    agent.velocity = Vector3.zero;
                }
            }

            if (!_rigidbody.useGravity && !actions && !agent.isOnOffMeshLink)
            {
                _rigidbody.velocity = animator.deltaPosition;
            }

            if (!agent.updatePosition && !actions)
            {
                var point = agent.enabled ? agent.nextPosition : destination;
                if (Vector3.Distance(transform.position, point) > 0.5f)
                {
                    desiredRotation = Quaternion.LookRotation(point - transform.position);
                    var rot = Quaternion.Euler(transform.eulerAngles.x, desiredRotation.eulerAngles.y, transform.eulerAngles.z);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, rot, agent.angularSpeed * Time.deltaTime);
                }
                transform.position = animator.rootPosition;
                return;
            }
            // Strafe Movement
            if (OnStrafeArea && !actions && currentTarget.transform != null && canSeeTarget && currentHealth > 0f)
            {
                Vector3 targetDir = currentTarget.transform.position - transform.position;
                float   step      = (meleeManager != null && isAttacking) ? attackRotationSpeed * Time.deltaTime : (strafeRotationSpeed * Time.deltaTime);
                Vector3 newDir    = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0F);
                var     rot       = Quaternion.LookRotation(newDir);
                transform.eulerAngles = new Vector3(transform.eulerAngles.x, rot.eulerAngles.y, transform.eulerAngles.z);
            }
            // Rotate the Character to the OffMeshLink End
            else if (agent.isOnOffMeshLink && !actions)
            {
                var pos = agent.nextOffMeshLinkData.endPos;
                targetPos = pos;
                UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
                desiredRotation    = Quaternion.LookRotation(new Vector3(data.endPos.x, transform.position.y, data.endPos.z) - transform.position);
                transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, (agent.angularSpeed * 2f) * Time.deltaTime);
            }
            // Free Movement
            else if (agent.desiredVelocity.magnitude > 0.1f && !actions && agent.enabled && currentHealth > 0f)
            {
                if (meleeManager != null && isAttacking)
                {
                    desiredRotation    = Quaternion.LookRotation(agent.desiredVelocity);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, agent.angularSpeed * attackRotationSpeed * Time.deltaTime);
                }
                else
                {
                    desiredRotation    = Quaternion.LookRotation(agent.desiredVelocity);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, agent.angularSpeed * Time.deltaTime);
                }
            }
            // Use the Animator rotation while doing an Action
            else if (actions || currentHealth <= 0f || isAttacking)
            {
                if (isRolling)
                {
                    desiredRotation    = Quaternion.LookRotation(rollDirection, Vector3.up);
                    transform.rotation = desiredRotation;
                }
                else
                {
                    transform.rotation = animator.rootRotation;
                }

                // Use the Animator position while doing an Action
                if (!agent.enabled)
                {
                    destination        = transform.position;
                    transform.position = animator.rootPosition;
                }
            }
        }
        void OnAnimatorMove()
        {
            if (agent.enabled)
            {
                agent.velocity = animator.deltaPosition / Time.deltaTime;
            }

            if (!_rigidbody.useGravity && !actions)
            {
                _rigidbody.velocity = animator.deltaPosition;
            }

            // Strafe Movement
            if (OnStrafeArea && !actions && target != null && canSeeTarget() && currentHealth > 0f)
            {
                Vector3 targetDir = target.position - transform.position;
                float   step      = (meleeManager != null && meleeManager.applyDamage) ? attackRotationSpeed * Time.deltaTime : (strafeRotationSpeed * Time.deltaTime);
                Vector3 newDir    = Vector3.RotateTowards(transform.forward, targetDir, step, 0.0F);
                var     rot       = Quaternion.LookRotation(newDir);
                transform.eulerAngles = new Vector3(transform.eulerAngles.x, rot.eulerAngles.y, transform.eulerAngles.z);
            }
            // Rotate the Character to the OffMeshLink End
            else if (agent.isOnOffMeshLink && !actions)
            {
                var pos = agent.nextOffMeshLinkData.endPos;
                targetPos = pos;
                UnityEngine.AI.OffMeshLinkData data = agent.currentOffMeshLinkData;
                desiredRotation    = Quaternion.LookRotation(new Vector3(data.endPos.x, transform.position.y, data.endPos.z) - transform.position);
                transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, (agent.angularSpeed * 2f) * Time.deltaTime);
            }
            // Free Movement
            else if (agent.desiredVelocity.magnitude > 0.1f && !actions && agent.enabled && currentHealth > 0f)
            {
                if (meleeManager != null && meleeManager.applyDamage)
                {
                    desiredRotation    = Quaternion.LookRotation(agent.desiredVelocity);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, agent.angularSpeed * attackRotationSpeed * Time.deltaTime);
                }
                else
                {
                    desiredRotation    = Quaternion.LookRotation(agent.desiredVelocity);
                    transform.rotation = Quaternion.RotateTowards(transform.rotation, desiredRotation, agent.angularSpeed * Time.deltaTime);
                }
            }
            // Use the Animator rotation while doing an Action
            else if (actions || currentHealth <= 0f || inAttack)
            {
                if (rolling)
                {
                    desiredRotation    = Quaternion.LookRotation(rollDirection - transform.position);
                    transform.rotation = desiredRotation;
                }
                else
                {
                    transform.rotation = animator.rootRotation;
                }

                // Use the Animator position while doing an Action
                if (!agent.enabled)
                {
                    transform.position = animator.rootPosition;
                }
            }
        }
        void DoGetOffMeshLinkData()
        {
            if (_agent == null)
            {
                return;
            }

            if (!_agent.isOnOffMeshLink)
            {
                return;
            }

            UnityEngine.AI.OffMeshLinkData link = new UnityEngine.AI.OffMeshLinkData();

            link = _agent.nextOffMeshLinkData;
            if (!startPos.IsNone)
            {
                startPos.Value = link.startPos;
            }

            if (!endPos.IsNone)
            {
                endPos.Value = link.endPos;
            }

            if (!activated.IsNone)
            {
                activated.Value = link.activated;
            }

            if (!valid.IsNone)
            {
                valid.Value = link.valid;
            }

            if (!OffMeshlinkType.IsNone)
            {
                switch (link.linkType)
                {
                case UnityEngine.AI.OffMeshLinkType.LinkTypeManual:
                    OffMeshlinkType.Value = "manual";
                    break;

                case UnityEngine.AI.OffMeshLinkType.LinkTypeDropDown:
                    OffMeshlinkType.Value = "dropDown";
                    break;

                case UnityEngine.AI.OffMeshLinkType.LinkTypeJumpAcross:
                    OffMeshlinkType.Value = "jumpAcross";
                    break;
                }
            }

            if (!costOverride.IsNone)
            {
                costOverride.Value = link.offMeshLink.costOverride;
            }

            if (!occupied.IsNone)
            {
                occupied.Value = link.offMeshLink.occupied;
            }

            if (!autoUpdatePositions.IsNone)
            {
                autoUpdatePositions.Value = link.offMeshLink.autoUpdatePositions;
            }

            if (!navmeshArea.IsNone)
            {
                navmeshArea.Value = link.offMeshLink.area;
            }

            if (!startGameObject.IsNone)
            {
                startGameObject.Value = link.offMeshLink.startTransform.gameObject;
            }

            if (!endGameObject.IsNone)
            {
                endGameObject.Value = link.offMeshLink.endTransform.gameObject;
            }
        }