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); }
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 }