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