首页 > 解决方案 > 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);
}
}

任何帮助将不胜感激

标签: c#unity3dgame-physics

解决方案


我的猜测:您的问题是您没有旋转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);
}

推荐阅读