我一直在关注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转换后它不会返回默认值,但是我不记得确切的原因。
谁能解释为什么“公共”不起作用以及为什么私有/静态/什么都没有?解决此问题的最佳/有效方法是什么?非常感谢。
答案 0 :(得分:2)
当某个字段是公共的(或可序列化)时,它会在检查器中显示。当它在检查器中显示时,您可以调整它的值,并且希望在检查器中保留对检查器中对值所做的调整。
在代码中声明变量时,可以指定一个初始值,如下所示:
public float jumpForce = 700f;
因此,该对象在创建后首次进行检查时,具有合理的值。然后,您进行调整并选择一个更好的值(或返回相同值,无论如何)。这就是您首选的价值!您希望对象在继续完成游戏的过程中保持这种功能。
因此,一旦在Inspector中对字段进行了调整,它就不再遵守您硬编码的初始值,通常这就是每个人都想要的。想象一下,如果每次您对班级进行更改时,所有经过调整的字段都恢复为初始硬编码值会很烦人……
如果某个字段以前是公开的,然后将其设为私有(或以任何方式隐藏在检查器中),则硬编码的初始值将保持不变。
但是,如果我真的希望我的对象恢复到其初始/默认配置怎么办?这就是为什么在检查器中创建了Reset方法和Reset按钮的原因!