【发布时间】:2018-03-17 13:36:56
【问题描述】:
我在 Unity 中遇到了一个问题,我试图用一个方向和一个速度实例化一个射弹。方向取决于 RotateMouse() 函数,该函数计算相对于鼠标的方向(对于射弹)。标准化后,我将其发送到另一个“弹丸运动”脚本,该脚本只是将其与速度相乘。
由于某种原因,当我将鼠标沿某个方向靠近角色时,它会变得非常慢,而距离很远则相反...我还调试了所有值,并且每个“方向”变量都是 sub 1 在 x,y 和 z...
你能发现问题吗?行为是尽管被标准化,但它的速度会有所不同,我不明白。
方向计算发生的脚本:
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, 控制器.difference.y、控制器.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
【问题讨论】:
-
它看起来不像 projectileDir 被规范化。这是与速度一起使用的值。你能贴出如何分配的代码吗
-
您好,projectileDir 的值在“ShootProjectile”协程代码的上方。
-
尽管如此,我还是改变了它,所以我直接在 RotateMouse 函数的 Shoot 脚本中使用了 controller.difference。它的行为相同。所以我写了这个: projectile.GetComponent
().Direction(controller.difference);但结果相同。并且差异被归一化。 -
可能它也在z轴上进行归一化。确保您正在规范化的值是 Vector2。
-
哇!就是这样..我将差异重命名为差异V2(矢量2)作为占位符并将其值放入差异V3(因为我想操纵z值)并在方向函数中使用V3,这一切都像一个魅力!谢谢:)
标签: c# unity3d 2d projectile