【问题标题】:When To Use Certain Operators In Unity Scripting何时在 Unity 脚本中使用某些运算符
【发布时间】:2014-05-31 03:38:20
【问题描述】:

几个小时前我发布了这个相同的脚本,它用于 2D 平台游戏中的视差。我相当有信心我了解其中的大部分内容。唯一真正困扰我的是乘法和加法运算符。现在我知道运算符本身很容易理解,但它们的使用方式有时会让我感到困惑。所以这个脚本实际上并不是我第一次遇到这些运算符的问题。

float parallax = (previousCamPos.x - cam.position.x) * parallaxScales[i];

float backgroundTargetPosX = backgrounds[i].position.x + parallax;   

这两行代码就是我在这种情况下所说的。最多,我真正能做的就是制作关于它们如何工作的受过教育的案例。在第二行中,这两个值似乎只是相互配对并存储在一个变量中,因此当相机移动时,背景也会随之移动。第一行似乎有点难以解释,我无法真正理解或真正描述这些值如何相互作用。有人可以帮助阐明为什么使用每个运算符以及何时使用一个运算符而不是另一个运算符?

using UnityEngine;
using System.Collections;

public class Parallaxing : MonoBehaviour {


public Transform [] backgrounds;    
private float [] parallaxScales;   
public float smoothing = 1f;      

private Transform cam;             
private Vector3 previousCamPos;    


void Awake () 

{
cam = Camera.main.transform; 
}

void Start ()

{
previousCamPos = cam.position;
parallaxScales = new float[backgrounds.Length]; 

for (int i = 0; i < backgrounds.Length; i++)  
{
    parallaxScales[i] = backgrounds[i].position.z * -1;

}
}

void Update () 
{

for (int i = 0; i < backgrounds.Length; i++)

{

    float parallax = (previousCamPos.x - cam.position.x) * parallaxScales[i];

    float backgroundTargetPosX = backgrounds[i].position.x + parallax;   


    Vector3 backgroundTargetPos = new Vector3 (backgroundTargetPosX, backgrounds[i].position.y, backgrounds[i].position.z);


    backgrounds[i].position = Vector3.Lerp (backgrounds[i].position, backgroundTargetPos, smoothing * Time.deltaTime);

}

previousCamPos = cam.position; 
}
}

【问题讨论】:

  • 顺便说一下,Unity 脚本是 Unity 的 Javascript 版本。您正在使用 C#。

标签: unity3d operators


【解决方案1】:

绝对值得您花时间学习和学习linear algebra。

第一行有两个计算(和一个赋值操作),我们来剖析一下。

(previousCamPos.x - cam.position.x)

这是寻找帧之间的移动变化(增量)。因此,如果相机的 X 上一帧是 22,而这一帧是 25,则返回的值将是 -3。

由于这是一个视差,我们不想要一对一的运动,所以我们scale delta 来抑制/夸大运动。 paralaxScales 是倒置的背景的 Z 位置(负)。因此,如果背景的 z 为 10,则标量为 -10,因此分配最终将看起来像这样(使用我们编造的数字)。

float parallax = -3 * -10; // which is, of course, 30

所以现在我们将运动夸大了十倍!现在我们将该增量应用到背景位置:

float backgroundTargetPosX = backgrounds[i].position.x + parallax; // parallax is 30

如果标量值为 1,则视差将是相机的精确移动,我们将进行 1 比 1 的移动,因此背景位置将以与相机相同的速率移动。

我希望这会有所帮助,并花时间学习linear algebra!

【讨论】:

  • 好的,非常感谢!这是一个很好的解释。我现在一定要学习线性代数,以便更好地理解我正在编写的代码。
猜你喜欢
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多