我几个小时前发布了这个相同的脚本,并在2D平台游戏中用于parallaxing。我相当自信,我理解其中的大部分内容。唯一真正困扰我的是乘法运算符和加法运算符。现在我明白操作员本身很容易理解,但是它们的使用方式有时让我很困惑。所以这个脚本实际上并不是我第一次遇到这些操作员的麻烦。
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;
}
}
答案 0 :(得分:2)
绝对值得你花时间学习和学习linear algebra。
第一行有两个计算(和一个赋值操作),让我们剖析它。
(previousCamPos.x - cam.position.x)
这是找到帧之间移动的变化(delta)。因此,如果相机的X是最后一帧的22,并且它是该帧的25,则返回的值将是-3。
由于这是一个视差,我们不想要1比1的运动,所以我们scale三角洲来抑制/夸大运动。 paralaxScales是倒置背景的Z位置(负数)。因此,如果背景的az为10,则标量为-10,因此赋值将最终看起来像这样(使用我们编造的数字)。
float parallax = -3 * -10; // which is, of course, 30
所以现在我们夸大了十倍的运动!现在我们将该delta应用于背景位置:
float backgroundTargetPosX = backgrounds[i].position.x + parallax; // parallax is 30
如果标量值为1,则视差将是相机的精确移动,我们将进行1到1的移动,因此背景位置将以与相机相同的速率移动。
我希望这会有所帮助,并且花时间研究linear algebra!