public void Init() { Segments = new List <Tentacle>(); if (GetComponent <Tentacle>() == null) { Debug.LogError($"Need a root segment on {gameObject.name} IKController"); } GetIkSegmentsRecursivelyFromChildren(gameObject); GetApproximateLengthOfLeg(); MirrorLimbTransformHierarchyAndInit(); InitTargetExtents(); void GetIkSegmentsRecursivelyFromChildren(GameObject segmentHolder) { var segs = segmentHolder.GetComponents <Tentacle>(); if (segs.Length > 2) { Debug.LogError($"There are {segs.Length} IKSegments at {segmentHolder} when there should only be 1!"); } var seg = segs[0]; Segments.Add(seg); for (int i = 0; i < segmentHolder.transform.childCount; i++) { var child = segmentHolder.transform.GetChild(i); if (child.GetComponent <Tentacle>() != null) { GetIkSegmentsRecursivelyFromChildren(child.gameObject); } } } void GetApproximateLengthOfLeg() { Reach = 0; for (int i = 0; i < Segments.Count; i++) { Reach += Segments[i].Reach; } } void InitTargetExtents() { _targetExtentCenter = _targetExtentCenter.normalized; var plane = new Plane(_targetExtentCenter, 0); } void MirrorLimbTransformHierarchyAndInit() { var IKSegmentTargets = new IKSegmentTarget[Segments.Count]; for (int i = 0; i < Segments.Count; i++) { IKSegmentTargets[i] = new GameObject($"segment_mirror: {i}").AddComponent <IKSegmentTarget>(); CopyPasteTransforms(Segments[i].transform, IKSegmentTargets[i].transform); //set transform if (i == 0) { IKSegmentTargets[i].transform.SetParent(transform.parent); } else { IKSegmentTargets[i].transform.SetParent(IKSegmentTargets[i - 1].transform); } } for (int i = 0; i < Segments.Count; i++) { //segment end if (i != Segments.Count - 1) { IKSegmentTargets[i].SegmentEnd = IKSegmentTargets[i + 1].transform; } else { var finalTip = new GameObject("segment_tip_tranform").transform; finalTip.SetParent(IKSegmentTargets[i].transform); CopyPasteTransforms(Segments[i].TipTransform, finalTip); IKSegmentTargets[i].SegmentEnd = finalTip; } Segments[i].Init(IKSegmentTargets[i]); } void CopyPasteTransforms(Transform copyFrom, Transform pasteOnto) { pasteOnto.transform.position = copyFrom.transform.position; pasteOnto.transform.rotation = copyFrom.transform.rotation; pasteOnto.transform.localScale = copyFrom.transform.localScale; } } }
public void Init(IKSegmentTarget iktarget) { _localTPoseRotation = transform.localRotation; IKTarget = iktarget; }