c# - 玩家瞬间卡在屏幕边缘!统一
问题描述
我正在开发一个 Unity 2d 游戏,该游戏围绕一个玩家在飞行时躲避随机物体......就像 flappybird 之类的东西。游戏工作正常。
但问题是当玩家触摸顶部屏幕边缘并继续施加力量时,玩家会在边缘卡住一段时间。我想我需要在玩家触摸屏幕边缘时禁用增加力。我希望你们帮助我。这是播放器代码。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Jetpack: MonoBehaviour
{
public GameManager GameManager;
private Rigidbody2D rb;
private float jumpForce = 40f;
private bool engineIsOn;
[SerializeField] private GameObject fire;
void Start()
{
engineIsOn = false;
fire.SetActive(false);
rb = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKey(KeyCode.Space))
{
engineIsOn = true;
fire.SetActive(true);
}
else
{
engineIsOn = false;
fire.SetActive(false);
}
transform.position = new Vector3(Mathf.Clamp(transform.position.x, -4.5f, 4.5f),
Mathf.Clamp(transform.position.y, -4.5f, 4.5f), transform.position.z);
}
private void FixedUpdate()
{
switch (engineIsOn)
{
case true:
rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Force);
break;
case false:
rb.AddForce(new Vector2(0f, 0f), ForceMode2D.Force);
break;
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
GameManager.gameover();
}
}
解决方案
每当处理Rigidbody
然后不要通过Transform
组件设置任何值!
这可能会破坏物理学。
然后基本上你已经说过了:如果你在边缘,不要增加更多的向上力量。
作为一个简单的技巧,您可以在撞击边缘时将 Y 速度设置为 0,例如
private void FixedUpdate()
{
// Very unusual to use a switch for a single bool
if (engineIsOn)
{
rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Force);
}
// This does absolutely nothing
// Adding a force of 0,0 doesn't change the velocity at all ...
//else
//{
// rb.AddForce(new Vector2(0f, 0f), ForceMode2D.Force);
//}
// Check if currently hitting an edge
// and if so set the velocity on that axis to 0
// also clamp the position then
var velocity = rb.velocity;
var position = rb.position;
if(Mathf.Abs(rb.position.x) >= 4.5f)
{
velocity.x = 0;
position.x = Mathf.Clamp(position.x, -4.5f, 4.5f);
}
if(Mathf.Abs(rb.position.y) >= 4.5f)
{
velocity.y = 0;
position.y = Mathf.Clamp(position.y, -4.5f, 4.5f);
}
rb.velocity = velocity;
rb.position = position;
}
推荐阅读
- c# - 如何通过 VSTO 插件运行 Excel 的菜单项?
- mysql - 为什么 mySQL 查询会给出意想不到的结果?
- javascript - 如何从 HTML 调用缩小的函数?
- c# - Unity 3D 使用用户输入围绕轨道移动物体
- php - 如何截断这个 PHP 语句?
- c# - StackExchange.Redis ConnectRetry 无法按预期工作
- javascript - 为什么不能在循环或嵌套函数中调用 React Hooks?
- python - Pyspark 到 pandas df 需要很多时间
- java - 如何将类加载到正在运行的 Java 程序中
- azure - 如何解决 Azure 中启动类中的异常?