我已经花了几个小时试图解决这个问题,我尝试了很多方法,但没有一个方法有效......
所以我有一个敌人跟随玩家使用AI,我需要精灵在敌人左转或右转时翻转。
这是我的代码的一部分(很多代码都是关于AI的,所以我只发布其中的一部分)
Vector3 dir = ( path.vectorPath[currentWaypoint] - transform.position ).normalized;
dir *= speed * Time.fixedDeltaTime;
//Move the AI
rb.AddForce (dir, fMode);
void Update () {
if (rb.AddForce > 0) {
sr.flipX = false;
} else if (rb.AddForce < 0)
sr.flipX = true;
animate.SetFloat ("pMove", Mathf.Abs(rb.AddForce));
}
答案 0 :(得分:1)
假设sr
是SpriteRenderer
组件,sr.flipX
方法很好。但是,您对Rigidbody
上的部队的评估是不对的。 rb.AddForce
的返回类型为void
,并且正确阅读Rigidbody
是否对其施加了力量的方法是阅读rb.velocity.magnitude
。此外,rb.velocity
会将GameObject的速度方向指定为Vector3
。假设您正在使用X轴,请将其放在LateUpdate
方法中:
sr.flipX = rb.velocity.magnitude > 0 && rb.velocity.x < 0 ? true : false;
如果Update
正在移动(Rigidbody
)并且它向左移动,而不是rb.velocity.magnitude > 0
方法中的if-else块会沿着X轴翻转精灵 - 手边(rb.velocity.x < 0
)。
在你的问题中,你只要求翻转精灵:作为Unity documentation states,flipX
仅影响渲染,而不影响其他组件(例如碰撞器和动画师)。
答案 1 :(得分:1)
翻转精灵的最简单方法是使用localScale.x *= -1;
而不是检查AddForce,你应该检查x轴上刚体的速度(如果你翻转精灵,也可以检查y轴,具体取决于它是否跳跃或下降)
基本上在Update()
中,您可以执行以下操作:vx = rigidbody.velocity.x;
将速度存储在精灵的x轴上。然后在LastUpdate()
中检查是否有必要翻转精灵:
if (vx > 0) {
facingRight = true;
} else if (vx < 0) {
facingRight = false;
}
if (((facingRight) && (localScale.x<0)) || ((!facingRight) && (localScale.x>0))) {
localScale.x *= -1;
}
这里有一个完整的例子,精灵根据玩家的输入进行移动。你需要为你的AI添加它。
//store references to components on the gameObject
Transform transform;
Rigidbody2D rigidbody;
public float MoveSpeed = 3f;
// hold player motion in this timestep
float vx;
float vy;
Awake () {
// get a reference to the components we are going to be changing and store a reference for efficiency purposes
transform = GetComponent<Transform> ();
rigidbody = GetComponent<Rigidbody2D> ();
}
void Update()
{
// determine horizontal velocity change based on the horizontal input
vx = Input.GetAxisRaw ("Horizontal");
//Change in case you are jumping or falling
vy = rigidbody.velocity.y;
// Change the actual velocity on the rigidbody
rigidbody.velocity = new Vector2(_vx * MoveSpeed, _vy);
}
// Checking to see if the sprite should be flipped
// this is done in LateUpdate since the Animator may override the localScale
// this code will flip the player even if the animator is controlling scale
void LateUpdate()
{
// get the current scale
Vector3 localScale = transform.localScale;
if (vx > 0) // moving right so face right
{
facingRight = true;
} else if (vx < 0) { // moving left so face left
facingRight = false;
}
// check to see if scale x is right for the player
// if not, multiple by -1 which is an easy way to flip a sprite
if (((facingRight) && (localScale.x<0)) || ((!facingRight) && (localScale.x>0))) {
localScale.x *= -1;
}
// update the scale
transform.localScale = localScale;
}