Unity- Player Jump Height / Public, Private, Static, 没有

Unity- Player Jump Height / Public, Private, Static, nothing

我一直在关注有关 Unity 中 2D 播放器控制器的教程(这是 'Live Training 16 Dec 2013 - 2D Character Controllers' 视频)。

我能够通过一些编辑成功实现教程中显示的所有内容,使其在 Unity 5 中运行。之后,我决定尝试一下,以便更好地理解。我尝试做的一件事是在按下 Space 键时更改跳跃高度。这是代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RobotControllerScript : MonoBehaviour {
    public float maxSpeed = 10f;
    bool facingRight = true;

    Animator anim;

    bool grounded = false;
    public Transform groundCheck;
    float groundRadius = 0.2f;
    public LayerMask whatIsGround;
    public float jumpForce = 700f;

    // Use this for initialization
    void Start () {
        anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void FixedUpdate () {

        grounded = Physics2D.OverlapCircle(groundCheck.position, groundRadius, whatIsGround);
        anim.SetBool("Ground", grounded);

        //vSpeed = vertical speed
        anim.SetFloat("vSpeed", GetComponent<Rigidbody2D>().velocity.y);

        float move = Input.GetAxis("Horizontal");

        anim.SetFloat("Speed", Mathf.Abs(move));

        GetComponent<Rigidbody2D>().velocity = new Vector2(move * maxSpeed, 
                                        GetComponent<Rigidbody2D>().velocity.y);

        if (move > 0 && !facingRight)
        {
            Flip();
        }
        else if (move < 0 && facingRight)
        {
            Flip();
        }
    }

    void Update()
    {
        if(grounded && Input.GetKeyDown(KeyCode.Space))
        {
            anim.SetBool("Ground", false);
            GetComponent<Rigidbody2D>().AddForce(new Vector2(0, jumpForce));
        }
    }

    void Flip()
    {
        facingRight = !facingRight;
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;
        transform.localScale = theScale;
    }
}

查看代码和教程说明,jumpForce 是控制角色跳跃高度(施加力)的变量。因此,我将 700f 更改为 5f。我希望这个角色能跳得很小,但事实并非如此。它跳到与 700f 相同的高度。

public float jumpForce = 700f;

修改代码后,我通过删除 jumpForce 旁边的 'public' 获得了预期的结果。解决此问题的其他方法是将其设置为私有或静态。我记得我在 QT Creator 上制作温度小部件时遇到了类似的问题。我必须将一个变量设置为静态,否则在 C 到 F 转换后它不会 return 为默认值,但我不记得确切原因。

谁能解释为什么 'public' 不起作用以及为什么 private/static/nothing 可以?这个问题的 best/efficient 解决方案是什么?非常感谢。

当字段 public(或可序列化)时,它会显示在检查器中。当它显示在检查器中时,您可以调整它的值,您希望在检查器中对值所做的调整在播放模式运行之间保留。

当你在代码中声明一个变量时,你可以指定一个初始值,像这样:

public float jumpForce = 700f;

所以,这个对象第一次被检查,创建后,它有一个合理的值。然后,您调整并选择一个更好的值(或返回相同值,无论如何)。那是你喜欢的价值!当您继续并完成游戏制作时,您希望该对象保持这样的功能。

因此,一旦在 Inspector 中调整了一个字段,它就不再尊重您硬编码的初始值,而这通常是每个人都想要的。想象一下,如果每次您在 class 中进行更改时,所有调整后的字段都恢复为初始硬编码值,那会有多烦人...

如果某个字段之前是 public,然后您将其设为私有(或以任何方式隐藏在检查器中),则硬编码的初始值将保持不变。

但是,如果我真的想让我的对象恢复到它的 initial/default 配置怎么办?这就是制作 Reset 方法和 inspector 中的重置按钮的原因!