在 Unity 中使用 & 引用和使用 * 取消引用
Referencing using & and defreferencing using * in Unity
这是 Unity 中的 C 变量引用问题,而不是游戏对象引用问题。
我需要获取 newVar
的地址,如 &newVar
。
这在 Unity 中可能吗?我已经尝试了很多搜索,但找不到答案。
有关于如何在 C 中执行此操作的文档,但我需要在 Unity 中执行此操作。
您需要 Pointers and the unsafe code 个关键字。
类 在 C# 中已经是引用,所以转换为指针没有多大用处。 IE a GameObject
已经是一个引用类型,它已经像指针一样工作了。
对于其他事情,例如 unmanaged types,您可能会使用不安全的代码和指针。
所以你可以做char* pc = &c;
还记得使用 文件 > 构建设置...“允许不安全代码”=>
单击播放器设置 => 代码设置 => 允许 'unsafe' 代码.
我从未使用过 Archimatix,但查看我在网上看到的手册,它看起来像这样。在 C# 中,lambdas 通过引用捕获变量,因此您可以让参数从 lambda 中读取结果以获得最新的变量。
public class ParamUpdater: MonoBehaviour {
[SerializeField] AXModel model;
List<AXParameter> params;
List<Func<float>> paramGetters;
// Use this for initialization
void Awake () {
// Establish refernces to AXModel parameters.
Params = new List<AXParameter>();
if (model != null)
{
Params.Add(model.getParameter("Engine.Param0"));
Params.Add(model.getParameter("Engine.Param1"));
// add more params here
}
paramGetters = new List<Func<float>>();
// create default getters
for (int i = 0 ; i < Params.Count ; i++)
{
paramGetters.Add(()=>0f);
}
}
public void ConfigureParamGetter(int index, Func<float> getter)
{
paramGetters[index] = getter;
}
public void Recalculate()
{
for(int i = 0 ; i < Params.Count ; i++)
{
float curVal = paramGetters[i]();
// Maybe a different method would be better?
// online API is very lacking...
Params[i].initiatePARAMETER_Ripple_setFloatValueFromGUIChange(curVal);
}
model.autobuild();
recalculate();
}
}
然后例如在一个 class 中,其中有一个感兴趣的浮点数,用一个 Func
调用 ConfigureParamGetter
那个 returns 变量。如前所述,捕获是通过引用完成的,因此在 ParamUpdater
.
中调用时它将始终是最新的
public class ImportantClass: MonoBehaviour
{
[SerializeField] ParamUpdater paramUpdater;
float importantFloat;
// Use Start to call after ParamUpdater initializes in Awake
void Start()
{
paramUpdater.ConfigureParamGetter(0, ()=>importantFloat);
}
// for example
void Update() { importantFloat = Time.time; }
// called whenever
void DoRecalculate()
{
paramUpdater.Recalculate();
}
}
如果我犯了任何语法错误或任何其他问题,请告诉我,我可以尝试修复它们。
这是 Unity 中的 C 变量引用问题,而不是游戏对象引用问题。
我需要获取 newVar
的地址,如 &newVar
。
这在 Unity 中可能吗?我已经尝试了很多搜索,但找不到答案。
有关于如何在 C 中执行此操作的文档,但我需要在 Unity 中执行此操作。
您需要 Pointers and the unsafe code 个关键字。
类 在 C# 中已经是引用,所以转换为指针没有多大用处。 IE a GameObject
已经是一个引用类型,它已经像指针一样工作了。
对于其他事情,例如 unmanaged types,您可能会使用不安全的代码和指针。
所以你可以做char* pc = &c;
还记得使用 文件 > 构建设置...“允许不安全代码”=> 单击播放器设置 => 代码设置 => 允许 'unsafe' 代码.
我从未使用过 Archimatix,但查看我在网上看到的手册,它看起来像这样。在 C# 中,lambdas 通过引用捕获变量,因此您可以让参数从 lambda 中读取结果以获得最新的变量。
public class ParamUpdater: MonoBehaviour {
[SerializeField] AXModel model;
List<AXParameter> params;
List<Func<float>> paramGetters;
// Use this for initialization
void Awake () {
// Establish refernces to AXModel parameters.
Params = new List<AXParameter>();
if (model != null)
{
Params.Add(model.getParameter("Engine.Param0"));
Params.Add(model.getParameter("Engine.Param1"));
// add more params here
}
paramGetters = new List<Func<float>>();
// create default getters
for (int i = 0 ; i < Params.Count ; i++)
{
paramGetters.Add(()=>0f);
}
}
public void ConfigureParamGetter(int index, Func<float> getter)
{
paramGetters[index] = getter;
}
public void Recalculate()
{
for(int i = 0 ; i < Params.Count ; i++)
{
float curVal = paramGetters[i]();
// Maybe a different method would be better?
// online API is very lacking...
Params[i].initiatePARAMETER_Ripple_setFloatValueFromGUIChange(curVal);
}
model.autobuild();
recalculate();
}
}
然后例如在一个 class 中,其中有一个感兴趣的浮点数,用一个 Func
调用 ConfigureParamGetter
那个 returns 变量。如前所述,捕获是通过引用完成的,因此在 ParamUpdater
.
public class ImportantClass: MonoBehaviour
{
[SerializeField] ParamUpdater paramUpdater;
float importantFloat;
// Use Start to call after ParamUpdater initializes in Awake
void Start()
{
paramUpdater.ConfigureParamGetter(0, ()=>importantFloat);
}
// for example
void Update() { importantFloat = Time.time; }
// called whenever
void DoRecalculate()
{
paramUpdater.Recalculate();
}
}
如果我犯了任何语法错误或任何其他问题,请告诉我,我可以尝试修复它们。