So, I have been trying to make inverse kinematics and while I did I came up with this code to get info on the transform and length of individual bones in a chain. It calculates the needed data and puts it in a table of "BoneSpecialStruct" Structures "BoneChain". Then it's supposed to write the contents of "BoneChain" in the debug console.
Actual IK is WIP.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InverseKinematics : MonoBehaviour
{
BoneSpecialStruct HighestParent;
BoneSpecialStruct[] BoneChain;
public int TargetChainLength;
public Transform IKtarget;
public struct BoneSpecialStruct
{
public Transform transform;
public float length;
public BoneSpecialStruct(Transform transform, float length)
{
this.transform = transform;
this.length = length;
}
}
void Start()
{
HighestParent.transform = transform;
Vector3 TempLength = new Vector3();
TempLength.x = HighestParent.transform.parent.position.x - HighestParent.transform.position.x;
TempLength.y = HighestParent.transform.parent.position.y - HighestParent.transform.position.y;
TempLength.z = HighestParent.transform.parent.position.z - HighestParent.transform.position.z;
HighestParent.length = Mathf.Pow(TempLength.y, 2) + (Mathf.Pow(TempLength.x, 2) + Mathf.Pow(TempLength.z, 2));
BoneChain[0] = new BoneSpecialStruct(HighestParent.transform, HighestParent.length);
for (int i = 0; i < TargetChainLength; i++)
{
HighestParent.transform = HighestParent.transform.parent;
TempLength.x = HighestParent.transform.parent.position.x - HighestParent.transform.position.x;
TempLength.y = HighestParent.transform.parent.position.y - HighestParent.transform.position.y;
TempLength.z = HighestParent.transform.parent.position.z - HighestParent.transform.position.z;
HighestParent.length = Mathf.Pow(TempLength.y, 2) + (Mathf.Pow(TempLength.x, 2) + Mathf.Pow(TempLength.z, 2));
BoneChain[i] = new BoneSpecialStruct(HighestParent.transform, HighestParent.length);
}
foreach (BoneSpecialStruct Bone in BoneChain)
{
Debug.Log(Bone);
}
}
void FixedUpdate()
{
//WIP
}
}
Expected to get info on bones in a chain however, when it is run I get error
NullReferenceException: Object reference not set to an instance of an object
InverseKinematics.Start () (at Assets/InverseKinematics.cs:32)
Don't how to fix it. Help.
I am using unity 2020.4f1 Personal, with Visual Studio Code and .NET 5.0