如何制作一个变量引用的字典?

4

我有很多基本上以不同变量为参数运作的相同函数。以下是一个简短的例子:

[SyncVar] private Vector3 syncedPlayerPosition;
[SyncVar] private Vector3 syncedHandPosition;

private Transform playerTransform;
private Transform handTransform;

private float lerpPlayerPositionRate;
private float lerpHandPositionRate;

void SetPlayerPosition(){

    if(playerTransform.position != syncedPlayerPosition){
        playerTransform.position = Vector3.Lerp(playerTransform.position, syncedPlayerPosition, Time.deltaTime * lerpPlayerPositionRate);
    }
}

void SetHandPosition(){

    if(handTransform.position != syncedHandPosition){
        handTransform.position = Vector3.Lerp(handTransform.position, syncedHandPosition, Time.deltaTime * lerpHandPositionRate);
    }
}

正如您所看到的,这两个函数基本上执行完全相同的操作,只是使用不同的变量。

现在我正在寻找类似于这样的东西(假设Dictionary可以像这样工作)

[SyncVar] private Vector3 syncedPlayerPosition;
[SyncVar] private Vector3 syncedHandPosition;

private Transform playerTransform;
private Transform handTransform;

private float lerpPlayerPositionRate;
private float lerpHandPositionRate;

/* Add Dictionaries to reference those variables */
private Dictionary<Transform,Vector3> positionDict = new Dictionary<Transform,Vector3>();
private Dictionary<Transform,float> lerpRateDict = new Dictionary<Transform,float>();

private void Start(){
    /* Fill the Dictionaries with Links between the Transforms
     * to the achording variable reference */

    /* Until now not the references are linked but rather values written */
    positionDict.Add(playerTransform, syncedPlayerPosition);
    positionDict.Add(handTransform, syncedHandPosition);

    lerpRateDict.Add(playerTransform, lerpPlayerPositionRate);
    lerpRateDict.Add(handTransform, lerpHandPositionRate);
}

/* Than I could use (and change) only one common function for both e.g like */
void SetPosition(Transform transform){

    if(transform.position != positionDict[transform]){
        transform.position = Vector3.Lerp(transform.position, positionDict[transform], Time.deltaTime * lerpRateDict[transform]);
    }

    /* Add this only as example that also this has to be posible */
    lerpRateDict[transform] += 1;
    positionDict[transform] = Vector3.zero(); 
}

我曾尝试过这种方法,但发现 Dictionary 中的值并没有被更新,仍然保持着 Start() 调用时的值。所以我认为它们似乎不是通过引用而是通过值添加到 Dictionary 中的。

是否有可能设置一种方式,让 Dictionary 实际上不存储值,而是存储对现有变量的引用?我该如何实现这样的功能?

我有很多这样的函数,每个小改动都必须逐个应用。像我想要的这样的设置将允许我只为所有函数进行一次更改。

编辑
我忘了提到:在这些函数中,有时候会更改 Vector3float 值,而不仅仅是 Transform


3
存储引用类型而非值类型。 - CodeCaster
@CodeCaster 怎么做? - derHugo
通过将其包装在 ValueTypeContainer<T> 中,您可以创建或类似的东西。 - CodeCaster
抱歉,我不是很明白...你能给我一个简短的例子吗?在这种情况下,什么是引用类型? - derHugo
你不需要字典,一个简单的方法就足以实现你想要的。请检查我的答案。 - Umair M
1个回答

4
为什么不创建一个可用于所有转换的方法:
```html 为什么不创建一个可用于所有转换的方法: ```
void SyncPositions(Transform thisTransform, Vector3 targetPosion, float rate)
{
    if (thisTransform.position != targetPosion)
    {
        thisTransform.position = Vector3.Lerp(thisTransform.position, targetPosion, Time.deltaTime * rate);
    }
}

您可以调用此函数来进行玩家变换或手部变换。
SyncPosition(playerTransform,syncedPlayerPosition,lerpPlayerPositionRate);
SyncPosition(handTransform,syncedHandPosition,lerpHandPositionRate);

希望这能帮到您。


1
这比奇怪的字典概念更有意义。名称说明动作,参数说明参与者。简单明了。 - Everts
抱歉,这不够详细。我没有提到的是,在这些函数中,Vector3float值也可能会发生变化... 这种方法是行不通的。 - derHugo
@derHugo 你想修改在 SetPosition() 中传递的参数值吗? - Umair M
@UmairM 是的,这可能是一个起点。我稍微编辑了一下我的问题,这样你就可以看到我有时也想设置这些值。 - derHugo
2
使用 ref 或 out 关键字。它们的工作方式类似于指向值的指针,并允许在方法内部更改它们,同时影响作为参数传递的原始值。不考虑装箱操作。坚持使用最好的方法,装箱操作很慢。 - Everts
@UmairM 非常感谢,我想这可能会为我节省很多麻烦。现在我正在尝试使用函数和例如 ref float lerpRate - derHugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接