【问题标题】:Unity Line Renderer Wont follow raycast?Unity Line Renderer 不会跟随光线投射?
【发布时间】:2020-04-20 05:20:05
【问题描述】:

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

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

任何帮助将不胜感激

【问题讨论】:

  • 它是否适用于Debug.DrawLine 并且是否根据鼠标位置旋转firePoint
  • @derHugo 是的,这条线可以在场景视图中看到,但由于某种原因,线渲染器只是在玩家面前直线射击,调试显示光线投射正在击中鼠标所在的对象指向
  • 是的,但主要问题是您从未真正将firePoint 朝向鼠标旋转 => 它始终具有默认旋转 => transform.Translate (Vector3.right * Time.deltaTime * moveSpeed); 将始终沿世界正确方向移动(仅在X 轴),因为它不考虑鼠标方向
  • @derHugo 哦,好的,谢谢,我要如何更改代码才能做到这一点?

标签: c# unity3d game-physics


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

【讨论】:

  • 谢谢,看起来不错,我收到错误 CS0103 当前上下文中不存在名称“origin”。这应该是什么?
  • 打错了..现在试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多