在 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();
    }
}

如果我犯了任何语法错误或任何其他问题,请告诉我,我可以尝试修复它们。