HOW TO FIX IK PROBLEM (HELP WANTED)

Hello all,
I was wandering if anyone knew how to fix this it says
Type or namespace definition, or end-of-file expected
I tried everything i knew but no luck

Here is the script

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;

namespace DitzelGames.FastIK
{
///


/// Fabrik IK Solver
///

public class FastIKFabric : MonoBehaviour
{
///
/// Chain length of bones
///

public int ChainLength = 2;

///


/// Target the chain should bent to
///

public Transform Target;
public Transform Pole;

///


/// Solver iterations per update
///

[Header(“Solver Parameters”)]
public int Iterations = 10;

///


/// Distance when the solver stops
///

public float Delta = 0.001f;

///


/// Strength of going back to the start position.
///

[Range(0, 1)]
public float SnapBackStrength = 1f;

protected float[ ] BonesLength; //Target to Origin
protected float CompleteLength;
protected Transform[ ] Bones;
protected Vector3[ ] Positions;
protected Vector3[ ] StartDirectionSucc;
protected Quaternion[ ] StartRotationBone;
protected Quaternion StartRotationTarget;
protected Transform Root;

// Start is called before the first frame update
void Awake()
{
Init();
}

void Init()
{
//initial array
Bones = new Transform[ChainLength + 1];
Positions = new Vector3[ChainLength + 1];
BonesLength = new float[ChainLength];
StartDirectionSucc = new Vector3[ChainLength + 1];
StartRotationBone = new Quaternion[ChainLength + 1];

//find root
Root = transform;
for (var i = 0; i <= ChainLength; i++)
{
if (Root == null)
throw new UnityException(“The chain value is longer than the ancestor chain!”);
Root = Root.parent;
}

//init target
if (Target == null)
{
Target = new GameObject(gameObject.name + " Target").transform;
SetPositionRootSpace(Target, GetPositionRootSpace(transform));
}
StartRotationTarget = GetRotationRootSpace(Target);

//init data
var current = transform;
CompleteLength = 0;
for (var i = Bones.Length - 1; i >= 0; i–)
{
Bones = current;
StartRotationBone = GetRotationRootSpace(current);
if (i == Bones.Length - 1)
{
//leaf
StartDirectionSucc = GetPositionRootSpace(Target) - GetPositionRootSpace(current);
}
else
{
//mid bone
StartDirectionSucc = GetPositionRootSpace(Bones[i + 1]) - GetPositionRootSpace(current);
BonesLength = StartDirectionSucc*.magnitude;*
CompleteLength += BonesLength*;*
}
current = current.parent;
}
}
// Update is called once per frame
void LateUpdate()
{
ResolveIK();
}
private void ResolveIK()
{
if (Target == null)
return;
if (BonesLength.Length != ChainLength)
Init();
//Fabric
// root
// (bone0) (bonelen 0) (bone1) (bonelen 1) (bone2)…
// x--------------------x--------------------x—…
//get position
for (int i = 0; i < Bones.Length; i++)
Positions = GetPositionRootSpace(Bones*);*
var targetPosition = GetPositionRootSpace(Target);
var targetRotation = GetRotationRootSpace(Target);
//1st is possible to reach?
if ((targetPosition - GetPositionRootSpace(Bones[0])).sqrMagnitude >= CompleteLength * CompleteLength)
{
//just strech it
var direction = (targetPosition - Positions[0]).normalized;
//set everything after root
for (int i = 1; i < Positions.Length; i++)
Positions = Positions[i - 1] + direction * BonesLength[i - 1];
}
else
{
for (int i = 0; i < Positions.Length - 1; i++)
Positions[i + 1] = Vector3.Lerp(Positions[i + 1], Positions + StartDirectionSucc*, SnapBackStrength);*
for (int iteration = 0; iteration < Iterations; iteration++)
{
//
*https://www.youtube.com/watch?v=UNoX65PRehA*_
//back
for (int i = Positions.Length - 1; i > 0; i–)
{
if (i == Positions.Length - 1)
Positions = targetPosition; //set it to target
else
Positions = Positions[i + 1] + (Positions - Positions[i + 1]).normalized * BonesLength*; //set in line on distance*
}
//forward
for (int i = 1; i < Positions.Length; i++)
Positions = Positions[i - 1] + (Positions - Positions[i - 1]).normalized * BonesLength[i - 1];
//close enough?
if ((Positions[Positions.Length - 1] - targetPosition).sqrMagnitude < Delta * Delta)
break;
}
}
//move towards pole
if (Pole != null)
{
var polePosition = GetPositionRootSpace(Pole);
for (int i = 1; i < Positions.Length - 1; i++)
{
var plane = new Plane(Positions[i + 1] - Positions[i - 1], Positions[i - 1]);
var projectedPole = plane.ClosestPointOnPlane(polePosition);
var projectedBone = plane.ClosestPointOnPlane(Positions*);*
var angle = Vector3.SignedAngle(projectedBone - Positions[i - 1], projectedPole - Positions[i - 1], plane.normal);
Positions = Quaternion.AngleAxis(angle, plane.normal) * (Positions - Positions[i - 1]) + Positions[i - 1];
}
}
//set position & rotation
for (int i = 0; i < Positions.Length; i++)
{
if (i == Positions.Length - 1)
SetRotationRootSpace(Bones, Quaternion.Inverse(targetRotation) * StartRotationTarget * Quaternion.Inverse(StartRotationBone*));
else
SetRotationRootSpace(Bones, Quaternion.FromToRotation(StartDirectionSucc, Positions[i + 1] - Positions) * Quaternion.Inverse(StartRotationBone));
SetPositionRootSpace(Bones, Positions);
}
}
private Vector3 GetPositionRootSpace(Transform current)
{
if (Root == null)
return current.position;
else
return Quaternion.Inverse(Root.rotation) * (current.position - Root.position);
}
private void SetPositionRootSpace(Transform current, Vector3 position)
{
if (Root == null)
current.position = position;
else
current.position = Root.rotation * position + Root.position;
}
private Quaternion GetRotationRootSpace(Transform current)
{
//inverse(after) * before => rot: before → after_

if (Root == null)
return current.rotation;
else
return Quaternion.Inverse(current.rotation) * Root.rotation;
_}
private void SetRotationRootSpace(Transform current, Quaternion rotation)
{
if (Root == null)
current.rotation = rotation;
else
current.rotation = Root.rotation * rotation;
}
void OnDrawGizmos()
{_

#if UNITY_EDITOR*

var current = this.transform;
for (int i = 0; i < ChainLength && current != null && current.parent != null; i++)
{
var scale = Vector3.Distance(current.position, current.parent.position) * 0.1f;
Handles.matrix = Matrix4x4.TRS(current.position, Quaternion.FromToRotation(Vector3.up, current.parent.position - current.position), new Vector3(scale, Vector3.Distance(current.parent.position, current.position), scale));
Handles.color = Color.green;
Handles.DrawWireCube(Vector3.up * 0.5f, Vector3.one);
current = current.parent;
}
}
#endif
}
}
}

If you post a code snippet, ALWAYS USE CODE TAGS:

How to use code tags: Using code tags properly

How to report your problem productively in the Unity3D forums:

http://plbm.com/?p=220

How to understand compiler and other errors and even fix them yourself:

Also, consider this:

You’re probably closing out the namespace with a “}” and then have something else following it that the compiler doesn’t think should be there. But your code is impossible to read down to the bottom the way you posted it, so can’t tell. Maybe you have too many “}”'s at the end. No idea what all that “[/i][/i][/i][/i][/i][/i][/i][/i]” garbage at the end is either. If that is really in your code, you’ll want to clean that up (maybe the forum added it?).

But you should be using a code editor like Visual Studio which highlights the exact problem.