C# 统一线渲染器不会跟随光线投射?
无法使线渲染器跟随光线投射? 这是raycast代码和子弹痕迹代码。线渲染按预期的方式弹出,但它只是在播放器前面沿直线移动,而不是在播放器单击/光线投射弹出的位置C# 统一线渲染器不会跟随光线投射?,c#,unity3d,game-physics,C#,Unity3d,Game Physics,无法使线渲染器跟随光线投射? 这是raycast代码和子弹痕迹代码。线渲染按预期的方式弹出,但它只是在播放器前面沿直线移动,而不是在播放器单击/光线投射弹出的位置 public class Weapon : MonoBehaviour { public float fireRate = 0; public float Damage = 0; public LayerMask whatToHit; public Transform BulletTrailPrefab; float timeTo
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);
}
}
任何帮助都将不胜感激我的猜测:您的问题是您没有旋转
火点
指向鼠标位置
因此使用
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);
}
它是否适用于
Debug.DrawLine
,是否根据鼠标位置旋转firePoint
?@derHugo是的,可以在场景视图中看到该线,但出于某种原因,线渲染器只是在播放器前面的直线上拍摄,调试显示光线投射正在撞击鼠标指向的对象是的,但主要问题是您从未真正朝鼠标方向旋转火点=>它将始终具有默认旋转=>transform.Translate(Vector3.right*Time.deltaTime*moveSpeed)代码>将始终沿世界右方向(仅在X轴上)移动,因为它不会将鼠标方向带入account@derHugo哦,好的,谢谢,我该如何更改代码才能做到这一点?谢谢,看起来很棒,我收到一个错误CS0103,当前上下文中不存在名称“origin”。这应该是什么?是打字错误。。现在试试