Example #1
0
    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;
            }
        }
    }
Example #2
0
 public void Init(IKSegmentTarget iktarget)
 {
     _localTPoseRotation = transform.localRotation;
     IKTarget            = iktarget;
 }