团结-运动员跳高/公共,私人,静态,无

时间:2018-07-19 01:55:04

标签: c# unity3d access-modifiers

我一直在关注Unity中2D播放器控制器的教程(这是“实时培训2013年12月16日-2D角色控制器”视频)。

我能够通过一些编辑成功实现本教程显示的所有内容,以使其能够在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上制作温度小部件时遇到过类似的问题。我必须将一个变量设置为static,否则在C到F转换后它不会返回默认值,但是我不记得确切的原因。

谁能解释为什么“公共”不起作用以及为什么私有/静态/什么都没有?解决此问题的最佳/有效方法是什么?非常感谢。

1 个答案:

答案 0 :(得分:2)

当某个字段是公共的(或可序列化)时,它会在检查器中显示。当它在检查器中显示时,您可以调整它的值,并且希望在检查器中保留对检查器中对值所做的调整。

在代码中声明变量时,可以指定一个初始值,如下所示:

public float jumpForce = 700f;

因此,该对象在创建后首次进行检查时,具有合理的值。然后,您进行调整并选择一个更好的值(或返回相同值,无论如何)。这就是您首选的价值!您希望对象在继续完成游戏的过程中保持这种功能。

因此,一旦在Inspector中对字段进行了调整,它就不再遵守您硬编码的初始值,通常这就是每个人都想要的。想象一下,如果每次您对班级进行更改时,所有经过调整的字段都恢复为初始硬编码值会很烦人……

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

但是,如果我真的希望我的对象恢复到其初始/默认配置怎么办?这就是为什么在检查器中创建了Reset方法和Reset按钮的原因!