Unity Line Renderer 不会跟随光线投射?
Unity Line Renderer Wont follow raycast?
无法让线渲染器跟随光线投射?
这是光线投射代码以及子弹轨迹代码。线条渲染按预期射出,但它只是在玩家面前直线,而不是玩家 clicks/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);
}
}
如有任何帮助,我们将不胜感激
我的猜测:你的问题是你没有旋转 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);
}
无法让线渲染器跟随光线投射? 这是光线投射代码以及子弹轨迹代码。线条渲染按预期射出,但它只是在玩家面前直线,而不是玩家 clicks/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);
}
}
如有任何帮助,我们将不胜感激
我的猜测:你的问题是你没有旋转 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);
}