Как правильно перевернуть объект?

Есть персонаж, он двигается с разные стороны, в зависимости от направления, я меняю ему Flip, на этом персонаже, в дочерних объектах есть Healthbar Canvas полоса со здоровьем, которая прикреплена к нему, в Healthbar Canvas так же есть дочерние объекты соответственно. Не могу понять, как сделать так, чтобы флипался персонаж, но Healthbar Canvas оставался в той же проекции и не переворачивался ?
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Enemy : MonoBehaviour
{
    public float health = 100f;
    public Slider sliderHP;
    public GameObject[] HeadObject;

    public Transform[] spawnPoints;
    public float movementSpeed = 2f;
    public float timeToWaitAtSpawn = 2f;
    public Animator animator;

    private int currentSpawnPointIndex = 0;
    private bool isMoving = true;
    private bool isFacingRight = true;

    private void Start()
    {
        int randomHeadObject = Random.Range(0, 5);

        if (randomHeadObject == 0)
            HeadObject[0].SetActive(true);
        else if (randomHeadObject == 1)
            HeadObject[1].SetActive(true);

        sliderHP.value = health / 100f;

        MoveToNextSpawnPoint();
    }

    void Update()
    {
        if (isMoving)
            MoveTowardsSpawnPoint();

        FlipCharacter();
    }

    public void TakeDamage(int damage)
    {
        health -= damage;
        if (health <= 0)
        {
            health = 0;
            Destroy(sliderHP.gameObject);
            Destroy(gameObject);
        }
        sliderHP.value = health / 100f;
    }

    private void MoveTowardsSpawnPoint()
    {
        Vector3 targetPosition = new Vector3(spawnPoints[currentSpawnPointIndex].position.x, transform.position.y, transform.position.z);
        transform.position = Vector3.MoveTowards(transform.position, targetPosition, movementSpeed * Time.deltaTime);

        if (Vector3.Distance(transform.position, targetPosition) <= 0.1f)
        {
            isMoving = false;
            animator.SetBool("Target", true);
            StartCoroutine(MoveToNextSpawnPointAfterDelay());
        }
        else
        {
            animator.SetFloat("Move", 1f);
            animator.SetBool("Target", false);
        }
    }

    private IEnumerator MoveToNextSpawnPointAfterDelay()
    {
        yield return new WaitForSeconds(timeToWaitAtSpawn);

        currentSpawnPointIndex = Random.Range(0, spawnPoints.Length);
        isMoving = true;
    }

    private void MoveToNextSpawnPoint()
    {
        currentSpawnPointIndex = Random.Range(0, spawnPoints.Length);
        Vector3 targetPosition = new Vector3(spawnPoints[currentSpawnPointIndex].position.x, transform.position.y, transform.position.z);
        transform.position = targetPosition;
    }

    private void FlipCharacter()
    {
        if (isMoving)
        {
            if (transform.position.x > spawnPoints[currentSpawnPointIndex].position.x && !isFacingRight)
            {
                Flip();
            }
            else if (transform.position.x < spawnPoints[currentSpawnPointIndex].position.x && isFacingRight)
            {
                Flip();
            }
        }
    }

    private void Flip()
    {
        isFacingRight = !isFacingRight;
        Vector3 newScale = transform.localScale;
        newScale.x *= -1;
        transform.localScale = newScale;
    }
}
  • Вопрос задан
  • 20 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Ente
Unity developer
Есть разные варианты сделать это, от костыльных до правильных.

1) Делать через повороты на Z, но поставить скрипт на канвас, который принудительно задаст нулевые повороты относительно сцены (по событию поворота или каждый кадр).
2) Использовать встроенный flipX на SpriteRenderer. Тогда сам объект не будет поворачиваться на сцене.
3) Сделать канвас отдельно от персонажа и связать с точкой на персонаже, где будет браться только позиция, а не повороты или scale.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы