【发布时间】:2022-11-21 00:46:35
【问题描述】:
这一切都是新的。我已经尝试按照我在此处找到的一些示例进行操作,但似乎都没有用。我现在拥有的最好的是
rb.transform.up = rb.GetComponent<Rigidbody2D>().velocity.normalized;
但这会使刚体立即旋转到新的行进方向。有没有办法让它旋转得更慢而不是在一帧中跳到新的行进方向?
任何帮助,将不胜感激 :)
这是我用来施加力的代码,如果重要的话?我是从一个教程中得到的,该教程基于拖动鼠标来施加力
public class DragNShoot : MonoBehaviour
{
public float power = 10f;
public Rigidbody2D rb;
public Vector2 minPower;
public Vector2 maxPower;
public TrajectoryLine tl;
Camera cam;
Vector2 force;
Vector3 startPoint;
Vector3 endPoint;
public void Start()
{
cam = Camera.main;
tl = GetComponent<TrajectoryLine>();
}
public void Update()
{
if (Input.GetMouseButtonDown(0))
{
startPoint = cam.ScreenToWorldPoint(Input.mousePosition);
startPoint.z = 15;
}
if (Input.GetMouseButton(0))
{
Vector3 currentPoint = cam.ScreenToWorldPoint(Input.mousePosition);
currentPoint.z = 15;
tl.RenderLine(startPoint, currentPoint);
}
if (Input.GetMouseButtonUp(0))
{
endPoint = cam.ScreenToWorldPoint(Input.mousePosition);
endPoint.z = 15;
force = new Vector2(Mathf.Clamp(startPoint.x - endPoint.x, minPower.x, maxPower.x), Mathf.Clamp(startPoint.y - endPoint.y, minPower.y, maxPower.y));
rb.AddForce(force * power, ForceMode2D.Impulse);
tl.EndLine();
}
}
}
这是轮换的脚本
public class FaceDirectionOfTravel : MonoBehaviour
{
public Rigidbody2D rb;
// Update is called once per frame
void Update()
{
rb.transform.up = rb.GetComponent<Rigidbody2D>().velocity.normalized;
}
}
如您所见,我刚刚获取了速度并将其应用于旋转,我猜这只是立即更改它以匹配,但我希望它明显旋转以匹配旋转。我已经尝试了一些我在这里看到的 Slerp 示例,但似乎只是让它自由旋转。我一定是遗漏了一些非常明显的东西,所以我想在这里问一下。谢谢。
编辑: 所以我想出了一种方法来让它工作,方法是在我希望旋转的对象顶部创建另一个对象,并使用 Slerp 旋转顶部的对象,慢慢旋转到与必须捕捉的原始对象相同的位置立即由于施加力,代码很简单
public class RotateSprite : MonoBehaviour
{
[SerializeField] private Rigidbody2D rbOfTarget;
[SerializeField] private Rigidbody2D rb;
private void Start()
{
}
// Update is called once per frame
void Update()
{
rb.transform.position = rbOfTarget.transform.position;
rb.transform.rotation = Quaternion.Slerp(rb.transform.rotation, rbOfTarget.transform.rotation, 30* Time.deltaTime);
}
}
如果有人知道更好的解决方案,请告诉我。谢谢。
【问题讨论】: