c# - (如何)我可以为变量引用制作字典吗?

标签 c# dictionary unity3d reference pass-by-reference

我有很多功能基本上以相同的方式工作,只是使用不同的变量。简短示例:

[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);
    }
}

如您所见,这两个函数基本上做同样的事情,只是使用了不同的变量。

现在我正在寻找这样的东西(假设 Dictionarys 会像那样工作)

[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() 被调用时的任何位置。所以在我看来,它们不是通过 Reference 而是通过 Value 添加到 Dictionary 中的。

是否有可能以某种方式设置它,以便在字典中实际存储的不是值而是对现有变量的引用?我怎样才能存档这样的东西?

我真的有很多这样的功能,每个小的变化都必须一个接一个地应用到它们。像我正在寻找的设置将允许我只对所有这些更改进行一次。

编辑
我忘了提及:在这些函数中,有时 Vector3float 值可能会发生变化,而不仅仅是 Transform

最佳答案

为什么不创建一个可以为所有转换调用的方法:

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);

希望对你有帮助

关于c# - (如何)我可以为变量引用制作字典吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47178713/

相关文章:

c# - 快速导入 MongoDb

c# - 显示多个项目的 Windows 上下文菜单

java - Thread.currentThread() 总是返回相同的实例吗?

c# - Visual Studio 与 Unity 不对应

unity3d - 为什么我不能缩放我的 Unity2D 正交游戏?

c# - 如何在 aspx 文件中调用中继器中的函数?

c# - 如何在 jqgrid 中添加新的按钮/图像列

c++ - 当我尝试将一对插入 map 时,Qt 程序出现段错误

python - 交换字典中的项目和顺序

unity3d - Unity 缺少命名空间