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