Поворот дочернего объекта относительно родителя - PullRequest
0 голосов
/ 04 апреля 2019

Я пытался вращать цель оружия моего игрока вместе с игроком. Мой игрок продолжает стрелять в правую сторону, даже если он смотрит влево Я создал цель под названием Firepoint, она установлена ​​как дочерний объект игрока. Я хочу, чтобы это изменилось, поскольку персонаж меняет свое направление. Любая помощь приветствуется.

enter image description here

Вот код игрока.

 public void Move()
{
    float controlThrow = CrossPlatformInputManager.GetAxis("Horizontal"); 
    Vector2 playerVelocity = new Vector2(controlThrow * runSpeed, myRigidBody.velocity.y);
    myRigidBody.velocity = playerVelocity;

    bool playerHasHorizontalSpeed = Mathf.Abs(myRigidBody.velocity.x) > Mathf.Epsilon; 

    myAnimator.SetBool("Walking", playerHasHorizontalSpeed);
}

 public void Flipsprite()
{

    bool playerhashorizontalspeed = Mathf.Abs(myRigidBody.velocity.x) > Mathf.Epsilon;

    if (playerhashorizontalspeed)
    {
        transform.localScale = new Vector2(Mathf.Sign(myRigidBody.velocity.x), 1f);
        transform.rotation = new Vector2(Mathf.Sign(firePoint.transform.localScale.x), 1f);

    }


}

1 Ответ

0 голосов
/ 04 апреля 2019

Проблема в том, что вращение не зависит от масштабирования. Только относительные шкалы и позиции.

Также, почему вы используете > Mathf.Epsilon, а не просто > 0. Насколько я понимаю, вам нужно только проверить, не равен ли он 0 ... использование Mathf.Epsilon настолько мало, что на самом деле это не имеет значения.

public void Move()
{
    float controlThrow = CrossPlatformInputManager.GetAxis("Horizontal"); 
    Vector2 playerVelocity = new Vector2(controlThrow * runSpeed, myRigidBody.velocity.y);
    myRigidBody.velocity = playerVelocity;

    bool playerHasHorizontalSpeed = Mathf.Abs(myRigidBody.velocity.x) > 0; 

    myAnimator.SetBool("Walking", playerHasHorizontalSpeed);
}

// store the last direction
int direction;

public void Flipsprite()
{
    bool playerhashorizontalspeed = Mathf.Abs(myRigidBody.velocity.x) > 0;

    if (playerhashorizontalspeed)
    {
        // update the direction
        direction = Mathf.Sign(myRigidBody.velocity.x);
        transform.localScale = new Vector2(direction, 1f);
    }
}

Затем, когда вы снимаете, умножьте направление также на direction

private IEnumerator FireContinuously() 
{ 
    while (true) 
    { 
        GameObject laser = Instantiate(bullet, firePoint.position, firePoint.rotation); 
        laser.GetComponent<Rigidbody2D>().velocity = new Vector2(projectileSpeed * direction, 0); 
        yield return new WaitForSeconds(projectileFiringPeriod); 
    } 
}  

небольшой намек:

Если вы делаете тип

public RigidBody2D bullet 

и снова перетащите соответствующий префаб, чтобы вам не нужно было использовать GetComponent, но вы могли бы напрямую использовать

var laser = Instantiate(bullet, firePoint.position, firePoint.rotation);
laser.velocity = ...
...