Your comments

yes Voucherwill be greate, for sure i will give you a positiove rating.

cycle problem only appear during video recoding of screen. I use https://github.com/ImtsSrl/KUKAVARPROXY (https://robodk.com/doc/en/RoboDK-Doc-EN-Robots-KUKA.pdf) on office lite VKRC. And from Unity side Python integration https://github.com/linuxsand/py_openshowvar and IronPython . May be possible to get some discount for Professional version?

this is C# code


using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
using Sharp7;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using IronPython.Hosting;
using System.Globalization;
using System.Text;

namespace game4automation
{
public class Kuka_var : InterfaceThreadedBaseClass
{

[ReadOnly] public string notifybar;
[ReadOnly] public string txtJoints;


public Drive Axis1;
public Drive Axis2;
public Drive Axis3;
public Drive Axis4;
public Drive Axis5;
public Drive Axis6;



private dynamic Kuka;




public string Values_2_String(double[] dvalues)
{
if (dvalues == null || dvalues.Length < 1)
{
return "Invalid values";
}
// Not supported on .NET Framework 2.0:
//string strvalues = String.Join(" , ", dvalues.Select(p => p.ToString("0.0")).ToArray());
string strvalues = dvalues[0].ToString();
for (int i = 1; i < dvalues.Length; i++)
{
strvalues += " , " + dvalues[i].ToString();
}

return strvalues;
//return "";
}

public double[] String_2_Values(string ACT_MES)
{
char[] delimiterChars = {':', ' ', ',', ' ', ',', ' ', ',', ' ', ',', ' ', ',', ' ', ',', ' ', ',', ',', ',', ',', ',','}'};
string[] words = ACT_MES.Split(delimiterChars);

double[] joints = new double[12];

for (int i = 1; i < 6; i++)
{
joints[i] = 0;
}
NumberFormatInfo provider = new NumberFormatInfo();
provider.NumberDecimalSeparator = ".";
provider.NumberGroupSeparator = ",";

joints[0] = Convert.ToDouble(words[3],provider);
joints[1] = Convert.ToDouble(words[6], provider);
joints[2] = Convert.ToDouble(words[9], provider);
joints[3] = Convert.ToDouble(words[12], provider);
joints[4] = Convert.ToDouble(words[15], provider);
joints[5] = Convert.ToDouble(words[18], provider);



return joints;
//return "";
}

public bool Check_ROBOT(bool ignore_busy_status = false)
{
return Kuka.CheckConnect();
}

//! Updates all signals in the parallel communication thread
protected override void CommunicationThreadUpdate()
{
double[] joints = new double[12];

if (!Check_ROBOT(true)) { return; }


joints = String_2_Values(Kuka.GetActPos());


Axis1.CurrentPosition = (float)joints[0];
Axis2.CurrentPosition = (float)joints[1] + 90;
Axis3.CurrentPosition = (float)joints[2] - 90;
Axis4.CurrentPosition = (float)joints[3];
Axis5.CurrentPosition = (float)joints[4];
Axis6.CurrentPosition = (float)joints[5];

string strjoints = Values_2_String(joints);
txtJoints = strjoints;

}


public override void OpenInterface()
{
var engine = Python.CreateEngine();

ICollection searchPaths = engine.GetSearchPaths();

//Path to the folder of greeter.py
searchPaths.Add(@"D:\Users\Dmitriy_Murashov\Conv1\Assets");
//Path to the Python standard library
searchPaths.Add(@"D:\Users\Dmitriy_Murashov\Conv1\Assets\Plugins\Lib\");
engine.SetSearchPaths(searchPaths);

dynamic py = engine.ExecuteFile(@"D:\Users\Dmitriy_Murashov\Conv1\Assets\kuka.py");
Kuka = py.Kuka();

Kuka.Connect();
base.OpenInterface();
}


public override void CloseInterface()
{

Kuka.DisConnect();

base.CloseInterface();
}

private void FixedUpdate()
{
}
private void Update()
{




}
}
}

and python code

from py_openshowvar import openshowvar
class Kuka():
def __init__(self):
return 1

def Connect(self):
self.client = openshowvar('192.168.216.128', 7000)
return self.client.can_connect

def GetActPos(self):
return self.client.read('$AXIS_ACT_MEAS', debug=False)

def DisConnect(self):
self.client.close()

def CheckConnect(self):
return self.client.can_connect

def __del__(self):
self.client.close()

i just add Cube on Carton object , 

And add script OnTrigPlatform with hardcode collisions on it.

Here is source code for script:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OnTrigPlatform : MonoBehaviour
{
public GameObject StandardParent;


#region Private Variables

private MeshRenderer _meshrenderer;
private Rigidbody _rigidbody;
private Collider _collider;
private bool _isMeshrendererNotNull;
private Transform _parent;
private int loaded;
private Vector3 _distancepos;
private Quaternion _distancerot;
#endregion

#region Private Methods



#endregion
// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{

}

private void OnTriggerEnter(Collider other)
{

Transform a;
string Name = other.gameObject.name;
if (Name == "conv" && loaded == 1)
{
//this.gameObject.transform.parent.gameObject.transform.parent = StandardParent.transform;
this.gameObject.transform.parent.gameObject.transform.parent = StandardParent.transform;
this.gameObject.transform.parent.gameObject.GetComponent().isKinematic = false;
this.gameObject.transform.parent.gameObject.GetComponent().useGravity = true;
//this.gameObject.transform.parent.gameObject.GetComponent().WakeUp();
//this.gameObject.transform.parent = StandardParent.transform;
//this.gameObject.transform.parent.gameObject.GetComponent().isKinematic = false;
loaded = 0;

}

if (Name == "Fork_001(Clone)" && loaded == 0)
{

//StandardParent = this.gameObject.transform.parent.gameObject;
//other.gameObject.transform.parent = this.gameObject.transform;
this.gameObject.transform.parent.gameObject.transform.parent = other.gameObject.transform;
this.gameObject.transform.parent.gameObject.GetComponent().isKinematic = true;
this.gameObject.transform.parent.gameObject.GetComponent().useGravity = false;
//StandardParent = this.gameObject.transform.parent.gameObject;
StandardParent = other.gameObject.transform.root.gameObject;
loaded = 1;

}

}

private void OnTriggerExit(Collider other)
{
string Name = other.gameObject.name;
if (Name == "Fork_001(Clone)" && loaded == 1)
{


// loaded = 0;

}
}
}

Not findeout better solution. But good enougth for tests