【问题标题】:How to do vector addition in Unity如何在 Unity 中进行矢量加法
【发布时间】:2022-06-29 04:25:58
【问题描述】:

这是我的第一个从头开始的游戏项目。我正在尝试制作弹球游戏,但我不想只是“观看有关如何制作弹球游戏的视频”。我想遇到问题并学习如何解决它们。

到目前为止,将脚本附加到精灵是问题 #1,但我已经解决了这个问题。问题 #2 是创建变量并将它们转换为真实对象值。经过几个小时的反复试验,我最终只是复制了其他人的脚本,该脚本具有最基本的设置,然后将其破坏并通过添加 void Update 将其重建为我在下面的内容。

我的问题主要是为了更好地了解我的一个新问题。 问题 #3 目前是当我单击播放时,它只移动对象一次。我认为 void update 应该调用每一帧? 我也想知道为什么我做transform.position的时候,为什么我不能做transform.position += (value 1, value 2)?从我从实验中得出的结论来看,改变 transform.position 的唯一方法是每次我不完全理解时都做 = new Vector ......这部分问题的另一种措辞是:有一种更短的方式来编写向量变换,或者这是唯一可以编写变化的方式?

下面是代码。我很感激任何答案,即使它只是在正确的路径上找到我想要的信息。

    public float width, height, xSpeed, ySpeed, xPosition, yPosition;
    public Vector2 position, scale;
    
    void Start() {
        // Initialise the variables
        width = 0.5f;
        height = 0.5f;
        xSpeed = 0;
        ySpeed = -1f;
        xPosition = 0;
        yPosition = 3.5f;

        // set the scaling
        Vector2 scale = new Vector2(width, height);
        transform.localScale = scale;
        
        // set the position
        transform.position = new Vector2(xPosition, yPosition);
    }

    void Update() {
        transform.position = new Vector2(xPosition + xSpeed, 
                                        yPosition + ySpeed);
    }

【问题讨论】:

标签: c# unity3d


【解决方案1】:

首先,我建议您将问题的标题更改为更贴切的内容,以便人们了解您的问题所涉及的编程概念! :) 我会推荐类似“如何在 Unity 中进行矢量添加”之类的内容。

我会一一解答你的问题:

是的,每帧都会调用更新函数!每次调用Update(),您都会一次又一次地将您的位置设置为完全相同的值。这就是为什么它不动。 xPosition/yPosition 和 xSpeed/ySpeed 变量在 Start() 中定义后都不会发生变化,因此您的更新函数将始终将您的位置设置为 (0, 2.5, 0)

你可以做向量加法!但为了做到这一点,您需要在代码中正确编写它,我的意思是 您需要从要添加的值中创建一个向量,然后才能将它们添加到位置向量!所以如果你想在你的位置上添加 xSpeed/ySpeed 值,它看起来像这样:

transform.position += new Vector2(xSpeed, ySpeed);

希望对你有帮助!

【讨论】:

  • 感谢您的建议。我已经更新了标题。 :) 你的解释帮助我更好地理解了这个问题。谢谢!但是我现在有一个不同的错误。虽然你所说的很有意义,但 Unity 似乎不这么认为,哈哈,我现在得到错误:运算符 '+=' 在'Vector3' 和'Vector2' 类型的操作数上不明确在我看来,我需要这样做括号内的计算或在这行代码之前进行计算并相应地更新矢量,例如。 xPosition += xSpeed 变换.... (xPosition,...) 我试试看告诉你
  • 是的,成功了!尽管我没有使用您的确切代码行,但我希望您知道您仍然通过帮助我更好地理解问题来解决我的问题,这对我来说是巨大的!我真的很欣赏这一点。 :) xPosition += xSpeed; y位置+= y速度; transform.position = new Vector2(xPosition, yPosition);
【解决方案2】:

在 Jayne 的帮助下,代码最终变成了这样,希望这可以帮助那些只想用简单的方法来改变向量的人:

public float width, height, xSpeed, ySpeed, xPosition, yPosition;
    public Vector2 position, scale;
    
    void Start() {
        // Initialise the variables
        width = 0.5f;
        height = 0.5f;
        xSpeed = 0;
        ySpeed = -0.01f;
        xPosition = 0;
        yPosition = 3.5f;

        // set the scaling
        Vector2 scale = new Vector2(width, height);
        transform.localScale = scale;
        
        // set the position
        transform.position = new Vector2(xPosition, yPosition);
    }

    void Update() {
        // Move the pinball
        xPosition += xSpeed;
        yPosition += ySpeed;
        transform.position = new Vector2(xPosition, yPosition);
    }

【讨论】:

  • 我很高兴听到我的回答有帮助!只需一点注意 - 您的变量 xPosition 和 yPosition 现在似乎只是存储您的变换位置。那么将它们作为变量保留的原因是什么?您可以改用transform.position.xtransform.position.y :) (请注意,您不能直接单独更改向量的 x 和 y 值 - 您必须进行向量加法或使用更新的值分配一个全新的向量改变它们)
  • 再次感谢 Jayne 的更多反馈。 :) 我会记住这一点,这听起来像是一种更精致的方式来做我想做的事情 :D 你可能也喜欢知道我想让弹球做的事情......实际上最终更容易通过添加刚体。我不知道刚体在 unity2d 中的工作方式与在 unity3d 中的工作方式相同。但是没有浪费时间,我现在知道如何使用向量,这对我开始研究桨时非常有用!
  • 太棒了 - 祝您的项目好运并获得良好的学习体验! :)
猜你喜欢
  • 2018-09-29
  • 2014-11-14
  • 1970-01-01
  • 2021-03-07
  • 2010-09-29
  • 2017-05-29
  • 2021-09-10
  • 2015-04-07
  • 2020-11-11
相关资源
最近更新 更多