示例#1
0
        private int Calculate()
        {
            var boneLimit = boneArray.Length;

            if (!Validate())
            {
                return(boneLimit);
            }
#if UNITY_EDITOR
            LookatDrawer.Clear(lookatPosition, boneLimit);
#endif

            var firstData        = lookatData.boneConfig[0];
            var firstBone        = boneArray[0];
            var forwardDirection = firstData.forward.GetDirection(firstBone.transform);
            var lookatDirection  = lookatPosition - firstBone.transform.position;
#if UNITY_EDITOR
            LookatDrawer.Push(firstBone.transform.position,
                              forwardDirection + firstBone.transform.position,
                              firstData);
#endif
            var i = 0;
            for (; i < boneLimit; i++)
            {
                var data     = lookatData.boneConfig[i];
                var bone     = boneArray[i];
                var isFinish = false;
                if (lookatData.lerpAxis)
                {
                    LerpAxisPerBone(i, forwardDirection, lookatDirection,
                                    out isFinish);
                }
                if (lookatData.clampAngle)
                {
                    ClampAnglePerBone(i, forwardDirection, lookatDirection,
                                      out isFinish);
                }
                if (isFinish)
                {
                    break;
                }
                if (i == boneLimit - 1)
                {
                    break;
                }
                //目标传递
                IterateTarget(i, firstData, firstBone,
                              out forwardDirection, out lookatDirection);
            }
            return(boneLimit);
        }
示例#2
0
        private void IterateTarget(int i, LookatData.BoneConfig firstBoneConfig, Bone firstBone,
                                   out Vector3 forwardDirection, out Vector3 lookatDirection)
        {
            //每次计算结束后直接赋值,初始位置坐标对应改变
            var firstBonePosition = firstBone.transform.position;
            var length            = Vector3.Distance(lookatPosition, firstBonePosition);
            var vtPosition        = firstBonePosition +
                                    firstBoneConfig.forward.GetDirection(firstBone.transform) * length;

            var nextBone         = boneArray[i + 1];
            var nextData         = lookatData.boneConfig[i + 1];
            var nextBonePosition = nextBone.transform.position;
            var vtDirection      = vtPosition - nextBonePosition;
            var finalDirection   = lookatPosition - nextBonePosition;

            forwardDirection = nextData.forward.GetDirection(nextBone.transform);
            lookatDirection  = Quaternion.FromToRotation(vtDirection, finalDirection)
                               * forwardDirection;
#if UNITY_EDITOR
            LookatDrawer.Push(nextBonePosition, vtPosition, nextData);
#endif
        }