问题描述
我正在为我的 Unity 游戏制作梯子。当您将鼠标悬停在它上面时,没有任何反应(这是正常的)。我想通过在按下向上箭头键(或 w)时将gravityscale 设置为 0 来冻结重力。谢天谢地,这有效。不幸的是,尽管每当我下降时,重力仍然为 0,但不知何故我的角色会落回地面。
这是我的播放器代码。抱歉,格式很糟糕;我只是删除了与梯子无关的内容,以免您阅读不相关的细节。
// ladder
public float climb;
public float climbspeed;
public float gravitystore;
public bool laddered;
public GameObject laddercheck;
public float upaxis;
public xpositionladdercheck ladderx;
// Start is called before the first frame update
void Start()
{
ladderx = FindobjectOfType<xpositionladdercheck>();
jumptimecounter = Jumptime;
jumpscriptbetter = FindobjectOfType<BetterJump>();
gameover = false;
respawnscreen = FindobjectOfType<RespawnIntermission>();
lives = 5;
atkindex = FindobjectOfType<attackindex>();
scale =transform.localScale;
basicattackscript = FindobjectOfType<BasicAttack>();
basicattacksupply = 0;
rb = GetComponent<Rigidbody2D>();
gravitystore = rb.gravityScale;
}
// Update is called once per frame
private void Update()
{
horimove = Input.GetAxis("Horizontal");
if (isDead == false)
{
upaxis = Input.GetAxis("Vertical");
anim.SetFloat("run",Mathf.Abs(horimove));
if (Input.GetKeyDown(KeyCode.Space) && laddered)
{
jumpladder();
}
anim.SetFloat("run",Mathf.Abs(horimove));
if (laddered && Mathf.Abs(upaxis) > .01)
{
rb.gravityScale = 0;
climbm();
} else if (!laddered)
{
rb.gravityScale = gravitystore;
}
if (laddered&&Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine("jumpable");
}
rb.veLocity = new Vector2(speed * horimove * Time.fixedDeltaTime,rb.veLocity.y);
if (Input.GetKey(KeyCode.Space) && OnGround)
{
jump();
}
}
}
IEnumerator jumpable()
{
laddercheck.SetActive(false);
yield return new WaitForSeconds(.8f);
laddercheck.SetActive(true);
}
void climbm()
{
if (laddered)
{
if (upaxis > .1f) {
} else if (!laddered)
{
rb.constraints = RigidbodyConstraints2D.FreezeRotation;
}
rb.veLocity = Vector2.up * climbspeed * upaxis *Time.deltaTime;
transform.position = new Vector2(ladderx.ladderxpos,rb.position.y);
// the ladder.x things is just a script that gets the x position of the ladder but it works well so ignore that.
}
}
public void jump()
{
}public void jumpladder()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector2.up * jumpforce * Time.fixedDeltaTime);
}
}
}
}
我将质量设置为最低 (.0001),但仍然发生同样的事情。我没有包括天梯位置脚本或我什至在天梯脚本上的感觉,但这与问题无关。它感觉一切都很好,xposition 脚本也运行良好。
解决方法
我想通了。出于某种原因,我不得不将 Physics2D.gravity 设置为新的 Vector2 (0,0);每当我爬梯子。然后我创建了一个向量 2 phygravity 变量,用于存储自然重力,并在我离开梯子时将其设置回原来的值。
physgravity = Physics2D.gravity;
Physics2D.gravity = new Vector2(0f,-9.81f);
private void Update()
{
if (!laddered)
{
Physics2D.gravity = new Vector2(0f,-9.81f);
}
____________________ (later on in the script)
if (laddered && Mathf.Abs(upaxis) > .01)
{
rb.gravityScale = 0;
Physics2D.gravity = new Vector2(0,0);
rb.velocity = new Vector2(0,0);
climbm();
谢谢我希望这有帮助!上帝保佑