Unity C#:弹丸速度相对于鼠标之间的距离
Unity C#: Projectile speed relative to distance between mouse
我在 Unity 中遇到问题,我试图实例化一个具有方向和速度的射弹。方向取决于 RotateMouse() 函数,该函数计算相对于鼠标的方向(对于射弹)。归一化后,我将它发送到另一个 "projectile movement" 脚本,该脚本只是将其乘以速度。
出于某种原因,当我让鼠标在某个方向靠近角色时,它的速度非常慢,而距离较远时则相反...我还调试了所有值,并且每个 "direction" 变量在 x、y 和 z 中为 sub 1...
你能发现问题吗?行为是尽管被归一化,它的速度还是会变化,我不明白这一点。
进行方向计算的脚本:
public void RotateMouse()
{
if (Input.GetButton(FindCharacter.FindPlayer(gameObject) + "AimPC"))
{
aimingMouse = true;
sRenderer.enabled = true;
canShoot = true;
var mousePos = Input.mousePosition;
var magePos = Camera.main.WorldToScreenPoint(transform.position);
difference = mousePos - magePos;
difference.Normalize(); // after normalize == direction
rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.x, transform.rotation.y, rotation_z + spriteRotationOffset));
}
else
{
aimingMouse = false;
sRenderer.enabled = false;
canShoot = false;
}
}
我实例化射弹并在之后立即设置方向的另一个脚本:
projectileDir = new Vector3(controller.difference.x,
controller.difference.y, controller.difference.z);
public IEnumerator ShootProjectile(int elementNr)
{
shooting = true;
GameObject projectile = Instantiate(projectilePrefabs[elementNr], instantiatePosition, Quaternion.Euler(0, 0, controller.rotation_z + rotationOffsetZ));
projectile.GetComponent<ProjectileMovement>().Direction(projectileDir);
yield return new WaitForSeconds(shootDuration);
shooting = false;
}
最后使用方向变量并计算速度:
public class ProjectileMovement : MonoBehaviour {
public float speed;
private Rigidbody2D rb;
private Vector3 direction;
private Collider2D projectileCollider;
private Animator animator;
void Start()
{
rb = GetComponent<Rigidbody2D>();
projectileCollider = GetComponent<Collider2D>();
animator = GetComponent<Animator>();
rb.velocity = speed * direction;
}
public void Direction(Vector3 startingDirection)
{
this.direction = startingDirection;
}
void FixedUpdate()
{
rb.velocity = direction * speed;
}
}
此外,如果您需要有关脚本的更多信息,我可以提供,但我想我已经展示了与此问题相关的所有内容。有什么不明白的可以评论。
如果问题难以形象化,请查看此 GIF 并观察火球相对于鼠标指针的速度:
Gyazo gif link
问题是我规范化了一个 Vector3,它通过首先规范化一个 Vector2(这给了我一个 different/correct 结果)然后将 x 和 y 值放入 Vector3 来解决z维度的!
我在 Unity 中遇到问题,我试图实例化一个具有方向和速度的射弹。方向取决于 RotateMouse() 函数,该函数计算相对于鼠标的方向(对于射弹)。归一化后,我将它发送到另一个 "projectile movement" 脚本,该脚本只是将其乘以速度。
出于某种原因,当我让鼠标在某个方向靠近角色时,它的速度非常慢,而距离较远时则相反...我还调试了所有值,并且每个 "direction" 变量在 x、y 和 z 中为 sub 1...
你能发现问题吗?行为是尽管被归一化,它的速度还是会变化,我不明白这一点。
进行方向计算的脚本:
public void RotateMouse()
{
if (Input.GetButton(FindCharacter.FindPlayer(gameObject) + "AimPC"))
{
aimingMouse = true;
sRenderer.enabled = true;
canShoot = true;
var mousePos = Input.mousePosition;
var magePos = Camera.main.WorldToScreenPoint(transform.position);
difference = mousePos - magePos;
difference.Normalize(); // after normalize == direction
rotation_z = Mathf.Atan2(difference.y, difference.x) * Mathf.Rad2Deg;
transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.x, transform.rotation.y, rotation_z + spriteRotationOffset));
}
else
{
aimingMouse = false;
sRenderer.enabled = false;
canShoot = false;
}
}
我实例化射弹并在之后立即设置方向的另一个脚本:
projectileDir = new Vector3(controller.difference.x, controller.difference.y, controller.difference.z);
public IEnumerator ShootProjectile(int elementNr)
{
shooting = true;
GameObject projectile = Instantiate(projectilePrefabs[elementNr], instantiatePosition, Quaternion.Euler(0, 0, controller.rotation_z + rotationOffsetZ));
projectile.GetComponent<ProjectileMovement>().Direction(projectileDir);
yield return new WaitForSeconds(shootDuration);
shooting = false;
}
最后使用方向变量并计算速度:
public class ProjectileMovement : MonoBehaviour {
public float speed;
private Rigidbody2D rb;
private Vector3 direction;
private Collider2D projectileCollider;
private Animator animator;
void Start()
{
rb = GetComponent<Rigidbody2D>();
projectileCollider = GetComponent<Collider2D>();
animator = GetComponent<Animator>();
rb.velocity = speed * direction;
}
public void Direction(Vector3 startingDirection)
{
this.direction = startingDirection;
}
void FixedUpdate()
{
rb.velocity = direction * speed;
}
}
此外,如果您需要有关脚本的更多信息,我可以提供,但我想我已经展示了与此问题相关的所有内容。有什么不明白的可以评论。
如果问题难以形象化,请查看此 GIF 并观察火球相对于鼠标指针的速度:
Gyazo gif link
问题是我规范化了一个 Vector3,它通过首先规范化一个 Vector2(这给了我一个 different/correct 结果)然后将 x 和 y 值放入 Vector3 来解决z维度的!