如何使弹丸转弯时带有弧线

2024-04-21

我有一门大炮,可以以抛物线弧线发射子弹。现在,当我发射子弹时,子弹的旋转速度与从大炮中发射时的旋转速度相同。

如何使子弹在空气中飞行时沿着弧线旋转?

我尝试了以下作为在项目符号上运行的脚本

附件1

public class PointingBehaviour:MonoBehaviour
{
    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    public void Update()
    {
        transform.up = rb.velocity;
    }
}

这效果相当好。但我在物体存在的第一帧上看到轻微的闪烁(我认为这是因为此时速度仍为 0),并且物体一旦撞击地面就会不受控制地旋转。

通过执行以下操作,我让它在开始时停止闪烁并在落地时停止旋转

public class BulletController : MonoBehaviour
{
    private Rigidbody _rb;
    private bool _followArc;
    private bool _firstFrame;
    private void Start()
    {
        _rb = GetComponent<Rigidbody>();
        _firstFrame = true;
        _followArc = true;
    }

    public void LateUpdate()
    {
        if (_followArc && !_firstFrame)
            transform.up = _rb.velocity;
        _firstFrame = false;
    }

    public void OnCollisionEnter(Collision collision)
    {
        _followArc = false;
    }
}

但如果我碰巧在空中撞到什么东西,它就会停止沿着弧线运动,然后自由翻滚直到落地。做我想做的事情的“正确”方法是什么?


因为人们想看到它,所以这里是生成子弹的代码。

public class TankController : MonoBehaviour
{

    private Transform _barrelPivot;
    private Transform _bulletSpawn;
    public GameObject Bullet;
    public float FirePower;
    public float RotationSpeed;
    public float TiltSpeed;

    private void Start()
    {
        _barrelPivot = GetComponentsInChildren<Transform>().First(x => x.CompareTag("BarrelPivotPoint"));
        _bulletSpawn = GetComponentsInChildren<Transform>().First(x => x.CompareTag("BulletSpawn"));
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            FireCannon();
        }
        //(SNIP) Handle turning left and right and pivoting up and down.
    }

    private void FireCannon()
    {
        var newBullet = SpawnBullet();
        var rb = newBullet.GetComponent<Rigidbody>();
        rb.AddForce(_bulletSpawn.up * FirePower, ForceMode.Impulse);
    }

    private GameObject SpawnBullet()
    {
        var newBullet = (GameObject) Instantiate(Bullet, _bulletSpawn.position, _bulletSpawn.rotation);
        newBullet.transform.localScale = Bullet.transform.localScale;
        return newBullet;
    }
}

我相信你所说的是 - 你的脚本 Exhibition1 效果很好。

如果你想一想,你所要做的就是当您需要时,可以关闭该行为。

在这种情况下,你会想“当它落地时,行为应该停止......我认为这就是你的物理意思。

关闭一个很容易MonoBehaviour,正如你所知enabled = false;

所以,你有一些脚本,比如Bullet也许BulletBoss

在那里你将有一个私有变量PointingBehaviour pb你只需 pb.enabled = false

(我不能告诉你“什么时候”你想这样做,这取决于你的游戏..所以它可能是“当海拔低于废话时”或“当我击中某物时”......可能OnCollisionEnter有关的。)

请注意 - 我相信您知道这一点 - 对于射弹的指向行为,只需沿切线设置它是非常基本的。

当您为这样的射弹编写指向行为时,尝试将其轻轻拉至切线,这是一件非常简单的事情。结果看起来非常真实。接下来也许添加一些随机的“摆动”,这非常像炸弹。令人惊奇的是,用户只需要几帧就能看到这样的东西。 (我想下一步将是真正的空气物理学!)

请注意,当然,PointingBehaviour应该只是它自己的脚本。你必须保持行为完全孤立。


关于LateUpdate提到的,有never需要使用它。

如果确实想在框架内进行排序,Unity 提供了一个“脚本顺序执行”系统(请参阅“首选项”菜单选项)。但这样做的唯一原因可能是出于某种实验原因。

这很像“使用全局”——没有理由这么做。与任何代码一样,如果您必须按照给定的顺序执行某些操作,只需按顺序调用即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使弹丸转弯时带有弧线 的相关文章

随机推荐

  • 从 REST API 返回的图像始终显示损坏

    我正在使用 React 为艺术作品集应用程序构建内容管理系统 客户端将 POST 到使用 Mongoose 插入 MongoDB 的 API 然后 API 在数据库中查询新插入的图像 并将其返回给客户端 这是我使用 Mongoose 连接到
  • 尝试在 React-Native Firebase 中使用电话身份验证时,iOS 模拟器中的应用程序崩溃

    我已按照文档进行操作并进行了必要的设置 但应用程序在启动时崩溃了 我无法弄清楚为什么会发生这种情况 有人使用过 rnfirebase 吗 面临这个问题 import React Component from react import Vie
  • Python 中的数独检查器

    我正在尝试用 python 创建一个数独检查器 ill formed 5 3 4 6 7 8 9 1 2 6 7 2 1 9 5 3 4 8 1 9 8 3 4 2 5 6 7 8 5 9 7 6 1 4 2 3 4 2 6 8 5 3 7
  • XSLT 仅当元素不存在时插入元素

    我有一个源文件
  • 原始类型“Bool”无法用任何文字表达

    我想让我的枚举轻松兼容 IBInspectable 所以为了简单起见 我尝试用类型来表示它Bool enum TopBarStyle Bool case darkOnLight case lightOnDark 但 Xcode 给了我 原始
  • ASP.NET 表单身份验证 Cookie 不会过期

    我在使用 ASP NET SQL 成员资格提供程序的网站上遇到问题 首次登录时一切正常 即 用户被定向到登录页面 并且在成功登录后 他们将被发送到他们请求的原始页面 但是 当他们关闭浏览器并重新打开浏览器后 身份验证 cookie 仍然存在
  • 想要在谷歌饼图图例中显示百分比数据

    I am using google charts API specifically pie chart in my code i want to show percentage which is displayed inside chart
  • 在Powershell中执行批处理文件

    我想从批处理文件执行以下命令 C OpenCover tools OpenCover Console exe register user target VS110COMNTOOLS IDE mstest exe targetargs tes
  • 带有 checkBoxEdit 列的 DevExpress XtraGrid 控件

    我有一个 DevExpressXtraGrid http devexpress com Products NET Controls WinForms Grid 具有三列和一个未绑定的 checkBoxEdit 列的控件 供用户在从网格中删除
  • 如何在 Java 中获取英国夏令时偏移 (BST)

    在英国 我想获取当前与 UTC GMT 的偏移量 目前偏移量是1小时 但似乎没有办法找到这个 Code TimeZone timeZone TimeZone getDefault logger debug Timezone ID is ti
  • 模板化 lambda 的显式实例化[重复]

    这个问题在这里已经有答案了 我刚刚遇到显式实例化模板 lambda 的问题 下面的代码无法编译 但我无法弄清楚这种情况下出了什么问题
  • 如何删除所有超过 2 天的空文件夹?

    我制作了一个脚本 删除路径中带有子文件夹的所有空文件夹 现在我必须做的是 如果一个文件夹是 2 天前创建的 并且它是空的 则应该将其与其他早于 2 天的空文件夹一起删除 如果不是 则不应删除它 我还需要 想要将已删除的文件夹写入日志中 我用
  • ERM:三元关系中的基数

    如何读取和 或指定实体关系模型 陈表示法 三元关系中的基数 最小 最大 例如 一位领导与他的相关员工一起考察了多项资格认证 现在 我想知道如何在最小 最大 表示法中指定基数 这是给定基数的另一个示例 我想知道如何阅读它 三元关系可以解读为
  • 选择组合框项目时启用文本框

    我想在选择组合框项时启用文本框 请注意 组合框项目未定义 而是我在组合框中使用项目源来获取组合框项目的列表 我想在选择组合框项目时更改文本框的属性 评论粘贴到原始问题
  • 为什么会话 cookie 在从域提供服务时有效,但在使用 IP 时却无效?

    我有一个 Flask 应用程序 其中的会话在我的本地开发计算机上运行良好 但是 当我尝试将其部署在亚马逊服务器上时 会话似乎不起作用 更具体地说 未设置会话cookie 不过 我可以设置普通的 cookie 我确保我有一个静态安全密钥 正如
  • 为对象序列提供 JsonFormat

    我试图在这里找到一些帮助来应用 DefaultJsonProtocol 的 JsonFormat 扩展 包含对象序列的类 所以对于课程来说 class Person val name String val adresses Seq Adre
  • 如何在oracle DB中存储日文字符?

    我想将日语 或任何语言 字符存储在我的 Oracle 数据库表的一列中 我使用 varchar2 作为数据类型 当我尝试将此字符 插入到该列时 它存储为 不知道该怎么办 需要帮忙 Note 我尝试将数据类型更改为 nvarchar2 仍然不
  • 适用于 Windows 的 SVN 挂钩

    我用谷歌搜索了一下 发现确实没有适用于 Windows 的 SVN hooks 资源 所以我想我应该在这里创建一个维基来集中它 如果您贡献 请务必注明 钩子的名称 脚本的作用 实际脚本 注意 我怀疑发布史诗般的脚本不会有用 防止提交空注释
  • 具有 Jetty 连接器的 Restlet 2.0.8 不会恢复 SSL 会话,而 Simple 连接器会恢复 SSL 会话

    有谁知道这是为什么 或者如何解决它 我正在使用 android 通过 httpclient 连接 简单连接器恢复连接很好 但 Jetty 每次都会执行新的握手 代码是相同的 这只是我在构建路径上获得的连接器 不断地重做握手会消耗大量的数据和
  • 如何使弹丸转弯时带有弧线

    我有一门大炮 可以以抛物线弧线发射子弹 现在 当我发射子弹时 子弹的旋转速度与从大炮中发射时的旋转速度相同 如何使子弹在空气中飞行时沿着弧线旋转 我尝试了以下作为在项目符号上运行的脚本 附件1 public class PointingBe