c# - 无论我的鼠标移动如何,如何让我的刚体子弹直线射击?
问题描述
我在 Unity 中制作了一个非常简单的 3D 游戏,我有这个航天飞机,我可以在小行星周围的空间中移动,并且可以在按下/按住鼠标按钮时进行射击。我通过在“发射器”transform.position 处实例化一个球体,然后对那个子弹对象施加一个向前的力来做到这一点。一切都很好,但是我不喜欢并且不知道如何解决的一件事是子弹在射击和左右移动鼠标时如何保持其位置,而不是始终保持完美的直线.
这是我同时拍摄和移动相机时的样子:
现在看起来我在尿激光,这从来都不是好事。我试着让子弹的速度快很多,但子弹变得越来越难看,看起来也不太好。
这是我射击子弹的代码:
private void Fire()
{
GameObject bullet = Instantiate(laserPrefab);
GameObject bullet2 = Instantiate(laserPrefab);
Physics.IgnoreCollision(bullet.GetComponent<Collider>(), shuttleCollider.GetComponent<Collider>());
Physics.IgnoreCollision(bullet2.GetComponent<Collider>(), shuttleCollider.GetComponent<Collider>());
bullet.transform.position = laserEmitter.position;
bullet2.transform.position = laserEmitter2.position;
/*Vector3 rotation = bullet.transform.rotation.eulerAngles;
Vector3 rotation2 = bullet2.transform.rotation.eulerAngles;
bullet.transform.rotation = Quaternion.Euler(rotation.x, transform.eulerAngles.y, rotation.z);
bullet2.transform.rotation = Quaternion.Euler(rotation2.x, transform.eulerAngles.y, rotation2.z);*/
bullet.GetComponent<Rigidbody>().AddForce(laserEmitter.forward * laserSpeed, ForceMode.Impulse);
bullet2.GetComponent<Rigidbody>().AddForce(laserEmitter.forward * laserSpeed, ForceMode.Impulse);
StartCoroutine(DestroyBulletAfterTime(bullet, bulletDeathTime, bullet2));
}
不要介意评论的行,我只是在乱搞,看看我能不能让它工作。无论有没有这些注释行,拍摄的行为都是一样的。
解决方案
当然,基于射弹的系统会表现得像射弹系统。
如果您想要激光行为,请使用 LineRenderer。Raycast 您的激光线应该结束的位置(激光最大距离或击中范围内物体的点)。
如果您不喜欢它的“静态”外观,请将 LineRenderer 材质更改为随时间变化的内容(搜索着色器/LineRenderer 效果)。
推荐阅读
- node.js - 如何在某些非云环境中打包和部署 Node/Express Web 应用程序?
- javascript - 如何在 phpunit + selenium 测试平台上获取 ajax 请求状态代码和响应数据?
- apache-spark - 我们可以将 Elasticsearch 视为 Spark Streaming 的状态维护数据存储吗?
- acumatica - 在查找屏幕中添加选中的复选框列并启用多选
- python - python:从.txt中读取并判断txt文件中的新字符串
- javascript - 如何将 JQuery 变量传递给 JQuery 中的 $_POST 键
- racket - 使用“eval”和“map”评估 cons 表达式(用 Racket 编写的 Racket 解释器)
- sql-server - 如何在 SSRS 堆积图数据标签中隐藏零值
- selenium-webdriver - 网页中的字段在自动化过程中表现不同。可能吗?
- javascript - webpack 4 - 用于多个条目的拆分块插件