c# - Unity Line Renderer 不会跟随光线投射?
问题描述
无法让线渲染器跟随光线投射?这是光线投射代码和子弹轨迹代码。线渲染按预期射出,但它只是在玩家面前直线前进,而不是玩家点击/光线投射射出的地方。
public class Weapon : MonoBehaviour
{
public float fireRate = 0;
public float Damage = 0;
public LayerMask whatToHit;
public Transform BulletTrailPrefab;
float timeToFire = 0;
Transform firePoint;
// Start is called before the first frame update
void Awake() {
firePoint = transform.Find("FirePoint");
if (firePoint == null)
{
Debug.LogError("No Firepoint?");
}
}
// Update is called once per frame
void Update()
{
if (fireRate == 0)
{
if (Input.GetButtonDown("Fire1"))
{
Shoot();
}
}
else
{
if (Input.GetButton("Fire1") && Time.time > timeToFire)
{
timeToFire = Time.time + 1/fireRate;
Shoot();
}
}
}
void Shoot() {
Vector2 mousePosition = new Vector2(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y);
Vector2 firePointPosition = new Vector2(firePoint.position.x, firePoint.position.y);
RaycastHit2D hit = Physics2D.Raycast(firePointPosition, mousePosition-firePointPosition, 100, whatToHit);
Effect();
Debug.DrawLine(firePointPosition, (mousePosition - firePointPosition)*100, Color.cyan);
if (hit.collider != null)
{
Debug.DrawLine(firePointPosition, hit.point, Color.red);
Debug.Log("Hit " + hit.collider.name + "and did" + Damage + "Damage");
}
}
void Effect()
{
Instantiate(BulletTrailPrefab, firePoint.position, firePoint.rotation);
}
}
和子弹轨迹:
public class Trail : MonoBehaviour
{
public int moveSpeed = 20;
// Update is called once per frame
void Update()
{
transform.Translate (Vector3.right * Time.deltaTime * moveSpeed);
Destroy(GameObject, 1);
}
}
任何帮助将不胜感激
解决方案
我的猜测:您的问题是您没有旋转firePoint
指向鼠标位置。
因此使用
Instantiate(BulletTrailPrefab, firePoint.position, firePoint.rotation);
可能等于
Instantiate(BulletTrailPrefab, firePoint.position, Quaternion.identity);
因此
transform.Translate (Vector3.right * Time.deltaTime * moveSpeed);
总是只在世界 X 方向移动。
我将使用专用方法使用所需信息初始化生成的对象,并将Destroy
调用移到那里,因此只执行一次:
public class Trail : MonoBehaviour
{
public int moveSpeed = 20;
private Vector2 _direction;
private bool _isInitialized;
public void Initialize(Vector2 direction)
{
_direction = direction;
_isInitialized = true;
Destroy(gameObject, 1);
}
// Update is called once per frame
void Update()
{
if(!_isInitialized) return;
transform.Translate (_direction * Time.deltaTime * moveSpeed);
}
}
然后像这样使用它
// Use the correct type here
public Trail BulletTrailPrefab;
private void Shoot()
{
Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
Vector2 firePointPosition = firePoint.position;
var direction = (mousePosition-firePointPosition).normalized;
var hit = Physics2D.Raycast(firePointPosition, direction, 100, whatToHit);
// no pass in the direction
Effect(direction);
Debug.DrawLine(firePointPosition, direction * 100, Color.cyan);
if (hit.collider != null)
{
Debug.DrawLine(firePointPosition, hit.point, Color.red);
Debug.Log("Hit " + hit.collider.name + "and did" + Damage + "Damage");
}
}
private void Effect(Vector2 direction)
{
var bullet = Instantiate(BulletTrailPrefab, firePoint.position, firepoint.rotation);
bullet.Initialize(direction);
}
推荐阅读
- django - Django 通用视图重定向
- awk - 字符串到行尾之间的 SED 或 AWK 提取仅留下找到的第一个结果
- pandas - 如何计算一个值的出现次数
- node.js - 当有包含图像的对象数组时,如何在 node.js 中使用 multer 上传图像?
- laravel - 如何将 laravel 路由中的 post 参数传递给 vue js 中的 axios?
- powershell - 从数组中调用项目并运行 foreach
- android - Android 上同时支持 BLE 和 HFP/A2DP 的智能手机芯片组的差异
- c - 在同一个 DPDK lcore 上运行多个线程
- apache-kafka - Kafka 提交:生产者与消费者
- ag-grid - Ag Grid v25.3.0 问题 - 当网格为空时,新数据似乎没有更新网格