我有很多功能基本上以相同的方式工作,只是使用不同的变量。简短示例:
[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
s 会像那样工作)
[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
中的。
是否有可能以某种方式设置它,以便在字典中实际存储的不是值而是对现有变量的引用?我怎样才能存档这样的东西?
我真的有很多这样的功能,每个小的变化都必须一个接一个地应用到它们。像我正在寻找的设置将允许我只对所有这些更改进行一次。
编辑
我忘了提及:在这些函数中,有时 Vector3
和 float
值可能会发生变化,而不仅仅是 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/