Unity Line Renderer是否遵循raycast?

问题描述 投票:-1回答:1

无法让线渲染器跟随光线投射吗?这是射线广播代码以及项目符号跟踪代码。线条渲染会按照预期的方式射击,但是它只是在播放器前面成一直线,而不是播放器单击/发出光线的位置。

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# unity3d game-physics
1个回答
0
投票

我的猜测:您的问题是您没有旋转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;
    Vector2 direction = (mousePosition-firePointPosition).normalized;
    RaycastHit2D hit = Physics2D.Raycast(firePointPosition, direction , 100, whatToHit);
    Effect(firePointPosition, direction);
    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");
    }
}

private void Effect(Vector2 direction)
{
    var bullet = Instantiate(BulletTrailPrefab, origin, firePoint.position, firepoint.rotation);
    bullet.Initialize(direction);
}
© www.soinside.com 2019 - 2024. All rights reserved.