Unity Line Renderer Не будете следовать Raycast? - PullRequest
0 голосов
/ 20 апреля 2020

Не можете получить линейный рендер, чтобы следовать Raycast? Вот код 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);
}
}

Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 20 апреля 2020

Мое предположение: ваша проблема в том, что вы не вращаете 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);
}
...