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 中的重置按钮的原因!
我一直在关注有关 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 中的重置按钮的原因!