【问题标题】:Unity- Player Jump Height / Public, Private, Static, nothingUnity-玩家跳跃高度/公共,私人,静态,无
【发布时间】:2018-12-27 00:53:39
【问题描述】:

我一直在关注 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 上制作温度小部件时遇到了类似的问题。我必须将变量设置为静态,否则在 C 到 F 转换后它不会返回默认值,但我不记得确切原因。

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

【问题讨论】:

  • 你在哪里把 700 改成了 5?在检查员或代码中?如果在检查器中,您是处于播放模式还是编辑模式?如果在代码中,您是否在变量声明或方法内部进行了更改,例如 update 或 start?
  • 我改变了公共浮动 jumpForce = 700f;到公共浮动 jumpForce = 5f;在代码中(C# 脚本)
  • 检查检查员。公共字段会自动序列化,这意味着该字段在检查器中设置为 700 并覆盖您的新 5

标签: c# unity3d access-modifiers


【解决方案1】:

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

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

public float jumpForce = 700f;

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

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

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

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

【讨论】:

  • 感谢您的精彩解释!
猜你喜欢
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多