unity3d 如何引用来自其他脚本的速度值并将其合并到我的运动脚本中?

ntjbwcob  于 2023-02-16  发布在  其他
关注(0)|答案(1)|浏览(100)

我正在做我的第二个游戏,我不太明白,这个游戏有类,每个类有不同的速度,我试着用速度的值来实现移动。
我有类Getters/setters不同部分的getter/setter,我已经测试过,值确实被赋给了类选择中的变量,我认为一切都很好。
我正在写我的移动脚本,我不知道我哪里出错了,我试过GetComponent〈〉函数GetComponent function added to an in-script variable,但是当我尝试这个函数时,它说PlayerSpeed变量在当前上下文中不存在,播放器不移动。我也试过废弃类中变量,直接使用getcomponent〈〉,但是也不起作用。任何帮助都将非常感谢。

dgtucam1

dgtucam11#

Start中的代码什么也不做。

private void Start ()
{
    float PlayerSpeed = GetComponent<BasePlayerClass>()._Speed;
}

这将速度值存储在局部变量中,该变量仅存在于Start的范围内,并且从未用于任何用途。
如果你需要一个类字段

private float PlayerSpeed;

然后对其进行初始化

private void Start ()
{
    PlayerSpeed = GetComponent<BasePlayerClass>()._Speed;
}

但是,一般来说,在多个位置存储相同的值是不好的做法--特别是如果速度应该在以后动态更改,请记住float是一个值类型,这意味着您存储的是值的副本,而不是引用。

你宁愿做

[SerializeField] private BasePlayerClass basePlayerClass;

private void Start ()
{
    if(!basePlayerClass) basePlayerClass = GetComponent<BasePlayerClass>();
}

然后直接访问和使用

rb.MovePosition(rb.position + movement * basePlayerClass._Speed);

一般来说,用_命名public成员有点不合常规/违反直觉。
通常你会去

public SomeType SomeName;
//Or
public SomeType someName;

然后相应地

private SomeType someType;
// Or respectively
private SomeType _someType;

具体到Unity,我个人更喜欢

public SomeType SomeName;
private SomeType _someName;
[SerializeField] private SomeType someName;

相关问题