Unity Line Renderer 不会跟随光线投射?

Unity Line Renderer Wont follow raycast?

无法让线渲染器跟随光线投射? 这是光线投射代码以及子弹轨迹代码。线条渲染按预期射出,但它只是在玩家面前直线,而不是玩家 clicks/raycast 射出的地方。

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);
}