C# 使用&;在统一中使用*

C# 使用&;在统一中使用*,c#,unity3d,self-reference,C#,Unity3d,Self Reference,这是Unity中的C变量引用问题,而不是游戏对象引用问题 我需要获取newVar的地址,如&newVar中所示。 这在统一中可能吗?我尝试了许多搜索,但都找不到答案 有关于如何在C中执行此操作的文档,但我需要在Unity中执行此操作。您需要和关键字 C#中的类已经是引用了,所以转换为指针没有多大用处。IE aGameObject已经是一个引用类型,它已经像指针一样工作了 对于其他事情,例如,您可能会使用不安全的代码和指针 所以你可以做一些事情,比如char*pc=&c 还请记住使用文件>生成设置

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

我需要获取
newVar
的地址,如
&newVar
中所示。 这在统一中可能吗?我尝试了许多搜索,但都找不到答案

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

您需要和关键字

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

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

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

还请记住使用文件>生成设置…=>
单击播放器设置=>代码设置=>允许使用“不安全”代码。

我从未使用过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();
    }
}

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

Unity使用
C
,而不是
C
。你能解释一下为什么你认为你需要这样做,你想解决什么问题吗?看起来可能是XY问题。这能回答你的问题吗?我正在使用Archimatix生成模型。该进程在节点中具有变量暴露,以创建列出的变量,以便在runtimecontroller中访问。他们的名字。我需要将它放在一个表中,以供newVar[I]引用,而不是编写显式与每个公开的var对话的代码。在我的例子中,我有9个变量,它们有+5个函数来处理它们,所以这相当于很多代码。@PaulMoore这些变量是什么类型的?它们都是花车吗?@Ruzihm它们都是花车。谢谢。如果我是作为顶级应用程序编写代码,那么这将是一个选项。但是,由于我对Unity有很深的了解,并且是一种基于代码的资产,所以这个选项对我来说似乎有点危险。它可能会破坏Unity或Archimatix中的操作级别。允许不安全代码可能会由于没有垃圾收集而导致内存泄漏或内存消耗。我不相信任何apk主机会允许这种情况,比如谷歌商店。不安全模式的缺点它增加了程序员检查安全问题的责任,额外的开发人员关注对于避免潜在错误或安全风险至关重要。它绕过了安全。因为CLR维护类型安全性和安全性,所以与C/C++不同,C#不支持托管代码中的指针算法。不安全关键字允许在非托管代码中使用指针。但是,由于没有遵守严格的对象访问规则,因此无法保证安全性。它还避免了类型检查,这有时会产生错误。是的。确切地C语言中的基本不安全代码使事情与C或C++非常相似。您可能会获得性能,但代价是增加风险。如果你需要表演,你可以试试。我把这个作为答案,并不是因为它告诉我我能做什么,而是因为警告仪式表达了对我想做的事情的安全。谢谢,谢谢,@Ruzihim。这是相当重的C。我怀疑我可以用斧头钻到引擎盖下,但我不愿意去那里。在我的项目中,这个访问方法又悄悄地出现了。看起来我比开发人员最初打算的要深入,但是访问权限在那里。对我来说,这是一条可能的途径。真正的测试是,如果我重新生成Ax实时控制器,访问过程是否仍然可行。
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();
    }
}