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 来根据塔与球之间的距离来控制塔的旋转角度。
我的动画曲线有两个关键点:
- (0, 90) // 意思是当他们距离球 0 个单位时,塔将旋转 90°
- (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 );
}
}
我想在下面的图像中实现塔楼受到力场影响的效果。
看起来很简单吧?
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 来根据塔与球之间的距离来控制塔的旋转角度。
我的动画曲线有两个关键点:
- (0, 90) // 意思是当他们距离球 0 个单位时,塔将旋转 90°
- (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 );
}
}