Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3d-如何有效地从属于另一个游戏对象的另一个类调用方法_C#_Unity3d_3d - Fatal编程技术网

C# Unity3d-如何有效地从属于另一个游戏对象的另一个类调用方法

C# Unity3d-如何有效地从属于另一个游戏对象的另一个类调用方法,c#,unity3d,3d,C#,Unity3d,3d,这是从这个开始的连续性 我想在这里做的是创建一个程序,根据3D模型的运动计算一些分数,并将其显示为模型颜色的变化 但是,由于模型的运动记录器、分数计算和着色来自不同游戏对象上的不同类,因此我需要使它们相互连接以共同工作 我提出了如下代码片段所示的解决方案,但系统变得滞后和僵硬。我对Unity world很陌生,所以我问你们,有没有更有效的方法来做这种工作 下面是我的详细代码结构,所以这个问题涉及到3个不同的类相互调用(都连接到不同的游戏对象) 1)BoneHighlighter.cs 根据上一个

这是从这个开始的连续性

我想在这里做的是创建一个程序,根据3D模型的运动计算一些分数,并将其显示为模型颜色的变化

但是,由于模型的运动记录器、分数计算和着色来自不同游戏对象上的不同类,因此我需要使它们相互连接以共同工作

我提出了如下代码片段所示的解决方案,但系统变得滞后和僵硬。我对Unity world很陌生,所以我问你们,有没有更有效的方法来做这种工作

下面是我的详细代码结构,所以这个问题涉及到3个不同的类相互调用(都连接到不同的游戏对象)

1)BoneHighlighter.cs

根据上一个问题的脚本对模型重新着色

//声明skindmesh渲染器
公众皮肤病;
//初始化
//之前将初始化设置为Start(),但我尝试将其设置为Awake(),以使初始化更快一点
无效唤醒()
{
如果(smr==null)smr=GetComponent();
smr.sharedMesh=(Mesh)实例化(smr.sharedMesh);
}
//更改高亮显示给定骨骼的顶点颜色
公共空白突出显示(整数索引,双倍比率=1)
{
Transform[]bones=null;
开关(索引)
{
case(int)Skeleton.Head:bones=Head;break;
大小写(int)Skeleton.UpperBody:bones=UpperBody;break;
case(int)Skeleton.LowerBody:bones=LowerBody;break;
大小写(int)Skeleton.RightUpperArm:bones=upperArmRight;break;
case(int)Skeleton.RightLowerArm:bones=lowererarmright;break;
case(int)Skeleton.rightnand:bones=handRight;break;
大小写(int)Skeleton.LeftUpperArm:bones=upperArmLeft;break;
case(int)Skeleton.LeftLowerArm:bones=LowerArrmLeft;break;
case(int)Skeleton.LeftHand:bones=handLeft;break;
大小写(int)Skeleton.RightUpperLeg:bones=upperLegRight;break;
case(int)Skeleton.RightLowerLeg:bones=lowerLegRight;break;
case(int)Skeleton.RightFoot:bones=footRight;break;
大小写(int)Skeleton.LeftUpperLeg:bones=upperLegLeft;break;
case(int)Skeleton.LeftLowerLeg:bones=lowerLegLeft;break;
case(int)Skeleton.LeftFoot:bones=footLeft;break;
默认:中断;
}
//Assert(smr!=null);
如果(smr!=null)
{
var mesh=smr.sharedMesh;
变量权重=网格。骨骼权重;
var colors=new Color32[weights.Length];
var总和=新浮点数[权重.长度];
对于(int j=0;j 0)
总和+=权重[i]。权重0;
如果(权重[i].boneIndex1==idx&&weights[i].weight1>0)
总和+=权重[i]。权重1;
如果(权重[i].boneIndex2==idx&&weights[i].weights 2>0)
总和+=权重[i]。权重2;
如果(权重[i].boneIndex3==idx&&weights[i].weights 3>0)
总和+=权重[i]。权重3;
和[i]+=和;
颜色[i]=Color32.Lerp(常规颜色、高亮颜色、和[i]*(浮动)比率);
mesh.colors32=颜色;
}
//Log(“骨骼索引:\t”+bones[j].ToString());
}
} 
else Debug.Log(“smr null”);
}
2)比较器.cs

这就是我调用
Highlight()
函数的地方,这个类将返回浮点数0-1来确定颜色的强度。我就是这样调用
Highlight()
函数的

//将highlighter类声明为公共变量
//从属性检查器拖放包含BoneHighlighter.cs的游戏对象
public BoneHighlighter highlighter=空;
//计算分数并将其传递给highlight()函数
私有void calculateScore(int数据)
{
.
.
高亮显示。高亮显示(高亮显示区域、成本);
}
//从其他游戏对象获取数据
公共void GetData(框架)
{
calculateScore((int)Skeleton.RightHand);
}
3)Manager.cs

此类用于在每一帧中获取3D模型数据,并将其传递给Comparator.cs进行分数计算

公共比较器comparatorClass=null;
无效更新()
{
.
.
comparatorClass.GetData(帧);
}
1)您真的必须调用
comparatorClass.GetData(frame)每次更新?如果是,那么你真的需要调用highlighter.Highlight(highlightedRegion,cost)每次更新

2) 另一个问题在于Highlight()方法。您可能需要移动以下零件:

 //Debug.Assert(smr != null);
if (smr != null) {
    var mesh = smr.sharedMesh;
    var weights = mesh.boneWeights;
    var colors = new Color32[weights.Length];
    var sums = new float[weights.Length];

    for (int j= 0; j<bones.Length; j++) {

        var idx = GetBoneIndex (bones [j]);

        for (int i = 0; i < colors.Length; ++i) {
            float sum = 0;
            if (weights [i].boneIndex0 == idx && weights [i].weight0 > 0)
                sum += weights [i].weight0;
            if (weights [i].boneIndex1 == idx && weights [i].weight1 > 0)
                sum += weights [i].weight1;
            if (weights [i].boneIndex2 == idx && weights [i].weight2 > 0)
                sum += weights [i].weight2;
            if (weights [i].boneIndex3 == idx && weights [i].weight3 > 0)
                sum += weights [i].weight3;
            sums [i] += sum;
            colors [i] = Color32.Lerp (regularColor, highlightColor, sums [i] * (float)ratio);
            mesh.colors32 = colors;
        }


        //Debug.Log("bone index:\t"+bones[j].ToString());
    }
} else {
    Debug.Log("smr null");
}
//Debug.Assert(smr!=null);
如果(smr!=null){
var mesh=smr.sharedMesh;
变量权重=网格。骨骼权重;
var colors=new Color32[weights.Length];
var总和=新浮点数[权重.长度];
对于(int j=0;j 0)
总和+=权重[i]。权重0;
如果(权重[i].boneIndex1==idx&&weights[i].weight1>0)
总和+=权重[i]。权重1;
如果(权重[i].boneIndex2==idx&&weights[i].weights 2>0)
总和+=权重[i]。权重2;
如果(权重[i].boneIndex3==idx&&weights[i].weights 3>0)
总和+=权重[i]。权重3;
和[i]+=和;
颜色[i]=Color32.Lerp(常规颜色、高亮颜色、和[i]*(浮动)比率);
mesh.colors32=颜色;
}
//Log(“骨骼索引:\t”+bones[j].ToString());
}
}否则{
Log(“smr null”);
}
进入共同例行程序,并针对特定情况仅启动该共同例行程序一次。例如:

public void Highlight(int index,double ratio = 1 ) {
StopAllCoroutines(); // stop all co routines already running.
Transform[] bones = null;
switch (index) {
case (int)Skeleton.Head:
    bones = head;
    break;
case (int)Skeleton.UpperBody:
    bones = upperBody;
    break;
case (int)Skeleton.LowerBody:
    bones = lowerBody;
default:
    break;
 if(bones != null)
 {       
   startCoroutine(actualHighlight(bones));
 }

}
Ienumrator actualHighlight(Transform[] bones)
{
 if (smr != null) {
    var mesh = smr.sharedMesh;
    var weights = mesh.boneWeights;
    var colors = new Color32[weights.Length];
    var sums = new float[weights.Length];

    for (int j= 0; j<bones.Length; j++) {

        var idx = GetBoneIndex (bones [j]);

        for (int i = 0; i < colors.Length; ++i) {
            float sum = 0;
            if (weights [i].boneIndex0 == idx && weights [i].weight0 > 0)
                sum += weights [i].weight0;
            if (weights [i].boneIndex1 == idx && weights [i].weight1 > 0)
                sum += weights [i].weight1;
            if (weights [i].boneIndex2 == idx && weights [i].weight2 > 0)
                sum += weights [i].weight2;
            if (weights [i].boneIndex3 == idx && weights [i].weight3 > 0)
                sum += weights [i].weight3;
            sums [i] += sum;
            colors [i] = Color32.Lerp (regularColor, highlightColor, sums [i] * (float)ratio);
            mesh.colors32 = colors;
            yield return new WaitForEndOfFrame();
        }


        //Debug.Log("bone index:\t"+bones[j].ToString());
    }
} else {
    Debug.Log("smr null");
 }
}
公共空白突出显示(整数索引,双倍比率=1){
StopAllCoroutines();//停止所有已经运行的协同例程。
Transform[]bones=null;
开关(索引){
case(int)Skeleton.Head:
博
 for (int j= 0; j<bones.Length; j++) {

    var idx = GetBoneIndex (bones [j]);

    for (int i = 0; i < colors.Length; ++i) {
        float sum = 0;
        if (weights [i].boneIndex0 == idx && weights [i].weight0 > 0)
            sum += weights [i].weight0;
        if (weights [i].boneIndex1 == idx && weights [i].weight1 > 0)
            sum += weights [i].weight1;
        if (weights [i].boneIndex2 == idx && weights [i].weight2 > 0)
            sum += weights [i].weight2;
        if (weights [i].boneIndex3 == idx && weights [i].weight3 > 0)
            sum += weights [i].weight3;
        sums [i] += sum;
        colors [i] = Color32.Lerp (regularColor, highlightColor, sums [i] * (float)ratio);
    }
}

mesh.colors32 = colors; // Finally, do it once
//declare SkinnedMeshRenderer
public SkinnedMeshRenderer smr;
//initialization
//previously put the initialization on Start(), but I try to put it on Awake() to make the initialization a bit sooner
void Awake () 
{
    if (smr == null) smr = GetComponent<SkinnedMeshRenderer>();
    smr.sharedMesh = (Mesh)Instantiate(smr.sharedMesh);
}

// Remember the index and ratio used last time to highlight.
private int prevIndex = -1;
private int prevRatio = -1;

// Change vertex colors highlighting given bone
public void Highlight(int index,double ratio = 1 ) 
{
    // If nothing changed, no need to highligh again - everything is already
    // highlighted. Break function execution.
    if (index == prevIndex && ratio == prevRatio) return;

    Transform[] bones = null;
    switch (index) 
    {
    case (int)Skeleton.Head:          bones = head;          break;
    case (int)Skeleton.UpperBody:     bones = upperBody;     break;
    case (int)Skeleton.LowerBody:     bones = lowerBody;     break;
    case (int)Skeleton.RightUpperArm: bones = upperArmRight; break;
    case (int)Skeleton.RightLowerArm: bones = lowerArmRight; break;
    case (int)Skeleton.RightHand:     bones = handRight;     break;
    case (int)Skeleton.LeftUpperArm:  bones = upperArmLeft;  break;
    case (int)Skeleton.LeftLowerArm:  bones = lowerArmLeft;  break;
    case (int)Skeleton.LeftHand:      bones = handLeft;      break;
    case (int)Skeleton.RightUpperLeg: bones = upperLegRight; break;
    case (int)Skeleton.RightLowerLeg: bones = lowerLegRight; break;
    case (int)Skeleton.RightFoot:     bones = footRight;     break;
    case (int)Skeleton.LeftUpperLeg:  bones = upperLegLeft;  break;
    case (int)Skeleton.LeftLowerLeg:  bones = lowerLegLeft;  break;
    case (int)Skeleton.LeftFoot:      bones = footLeft;      break;
    default: break;
    }

    //Debug.Assert(smr != null);
    if (smr != null) 
    {
        var mesh    = smr.sharedMesh;
        var weights = mesh.boneWeights;
        var colors  = new Color32[weights.Length];
        var sums    = new float[weights.Length];

        for (int j= 0; j<bones.Length; j++) 
        {
            var idx = GetBoneIndex (bones [j]);

            for (int i = 0; i < colors.Length; ++i) 
            {
                float sum = 0;
                if (weights [i].boneIndex0 == idx && weights [i].weight0 > 0)
                    sum += weights [i].weight0;
                if (weights [i].boneIndex1 == idx && weights [i].weight1 > 0)
                    sum += weights [i].weight1;
                if (weights [i].boneIndex2 == idx && weights [i].weight2 > 0)
                    sum += weights [i].weight2;
                if (weights [i].boneIndex3 == idx && weights [i].weight3 > 0)
                    sum += weights [i].weight3;
                sums [i] += sum;
                colors [i] = Color32.Lerp (regularColor, highlightColor, sums [i] * (float)ratio);
            }

            //Debug.Log("bone index:\t"+bones[j].ToString());
        }

        mesh.colors32 = colors; // Finally, do it once
    } 
    else Debug.Log("smr null");
}