Unity 对象围绕力场弯曲

Unity objects bend around forcefield

我想在下面的图像中实现塔楼受到力场影响的效果。

看起来很简单吧?

GameObject towers = GameObject.Find("towers");
GameObject ball = GameObject.Find ("ball");

foreach (Transform tower in towers.transform) {
    Vector3 heading = ball.transform.position - tower.position;
    float distance = heading.magnitude;
    Vector3 direction = heading.normalized;
    Vector3 newDir = Vector3.RotateTowards(ball.transform.position, heading, 1, 0.0F);
    tower.rotation = Quaternion.LookRotation(newDir);
    //Debug.DrawRay(ball.transform.position, newDir, Color.red);
}

这是结果:

后面的塔还不错,前面的塔倒错了。发生了什么?另外,有没有办法根据球到塔的距离来控制塔弯曲的影响程度?

这是一个解决方案,它使用 AnimationCurve 来根据塔与球之间的距离来控制塔的旋转角度。

我的动画曲线有两个关键点:

  1. (0, 90) // 意思是当他们距离球 0 个单位时,塔将旋转 90°
  2. (10, 0) // 意思是塔将在距离球 10 个单位时旋转 0°
public AnimationCurve effect;
private GameObject towers ;
private GameObject ball ;

private void Start()
{
    towers = GameObject.Find("towers");
    ball = GameObject.Find ("ball");
}

private void Update()
{
    foreach (Transform tower in towers.transform)
    {
        Vector3 direction = (ball.position - tower.position);
        Vector3 rotationAxis = Vector3.Cross( direction.normalized, Vector3.up );
        float angle = effect.Evaluate( direction.magnitude ) ;
        tower.rotation = Quaternion.AngleAxis( angle, rotationAxis );
        // If you want your towers to look at your ball :
        // tower.rotation = Quaternion.LookRotation( direction ) * Quaternion.Euler( -angle, 0, 0 );
    }
}