【问题标题】:Dead zones in a bullet trajectory - unity 2d子弹轨迹中的死区 - unity 2d
【发布时间】:2020-06-22 02:36:27
【问题描述】:

我正在为两个玩家制作一个小型射手,每个人都可以射门。问题是当子弹高速飞行时,它的轨迹中有某些区域不会接触到物体,因此 OnTriggerEnter2d 在那里不起作用。这是子弹飞行脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Bullet: MonoBehaviour
{
    Rigidbody2d rb;
    public int Player;
    public float speed = 0.4f;
    public Vector3 mode; // Direction of the bullet (Vector3.left, right)
    // Start is called before the first frame update
    void Start ()
    {
        rb = gameObject.GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void FixedUpdate ()
    {
        rb.velocity = mode * speed;
    }
}
 

【问题讨论】:

  • 那你想要什么?
  • 如何解决??
  • 试试这个:Rigidbody2D &gt; Collision Detection &gt; Continuous
  • 此脚本中没有 OnTriggerEnter2D。你是故意删的吗?

标签: c# unity3d 2d


【解决方案1】:

高速物理始终是一个难以破解的难题。就像 Iggy 提到的那样,您可以/应该使用连续碰撞检测。

如果您仍然有问题并且仍然想要快速射弹,那就更难了。这里有一些选项。

您可以在时间设置中降低物理时间步长(不推荐但您可以测试非常昂贵)。

您可以动态地使子弹的对撞机更大。 (可能是最简单最简单的解决方案)。当你生成子弹时,根据它们的速度计算一个盒子对撞机应该有多长,然后像轨迹一样动态地将它定位在子弹后面(确保子弹向前移动到足以完全展开,这样你就不会撞到玩家身后的东西)。盒子碰撞器的大小应该与它每帧移动的距离相同。这样,在框架中移动一吨之后,子弹在框架中的所有位置都会触发盒子对撞机的碰撞。对于子弹冲击和特效,不要在子弹所在的位置而是在接触点产生它们。

您可以计算是否应该发生碰撞。 (在物理更新后检查弹丸背后的光线投射)。

你可以做你自己的物理或混合。 Unity 允许您在需要时手动模拟物理,而不是正常的物理更新。通过更多控制,您可以为快速移动的对象添加更多计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多