在Unity中转身时翻转敌人的精灵

时间:2017-10-15 03:49:18

标签: c# unity3d 2d sprite flip

我已经花了几个小时试图解决这个问题,我尝试了很多方法,但没有一个方法有效......

所以我有一个敌人跟随玩家使用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));   
}

2 个答案:

答案 0 :(得分:1)

假设srSpriteRenderer组件,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 statesflipX仅影响渲染,而不影响其他组件(例如碰撞器和动画师)。

答案 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;
}