在 Unity 中使用 & 引用和使用 * 取消引用

问题描述

这是 Unity 中的 C 变量引用问题,而不是游戏对象引用问题。

我需要获取 newVar 的地址,如 &newVar。 这在 Unity 中可能吗?我尝试了很多搜索,但都没有找到答案。

有关于如何在 C 中执行此操作的文档,但我需要在 Unity 中执行此操作。

解决方法

我从未使用过 Archimatix,但查看我在网上看到的手册,看起来这会起作用。在 C# 中,lambda 通过引用捕获变量,因此您可以让参数从 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();
    }
}

然后例如在一个存在感兴趣的浮点数的类中,使用返回变量的 ConfigureParamGetter 调用 Func。如前所述,捕获是通过引用完成的,因此在 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();
    }
}

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

,

您需要 Pointersunsafe code 关键字。

C# 中的类已经是引用,因此转换为指针并没有多大用处。 IE a GameObject 已经是一个引用类型,它已经像一个指针一样工作了。

对于其他事物,例如 unmanaged types,您可能会使用不安全的代码和指针。

所以你可以做一些事情,比如char* pc = &c;

还记得使用文件>构建设置...=>“允许不安全的代码” 点击播放器设置 => 代码设置 => 允许“不安全”代码

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...