Barra de sangue de personagem de aprendizagem Unity-2D [registro de BUG] e problema de acerto

Requisito: Crie uma IU de barra de sangue que deduz sangue quando o personagem é atingido.

Ideia: criar uma tela, criar BaseUI>HP>TEXT em ordem, escrever HP.cs e inicializar o valor atual HealthCurrent e o máximo (valor original) HealthMax duas variáveis ​​e obter o valor original da variável de saúde do personagem de PlayerController para atribuição.

Código (HP.cs):

...
    // 初始化数显 
    public Text healthText;
    // 定义静态变量当前血量
    public static int HealthCurrent;
    // 定义静态变量原始血量
    public static int HealthMax;

    private Image healthBar;
    // Start is called before the first frame update
    void Start()
    {
        healthBar = GetComponent<Image>();
        HealthCurrent = HealthMax;
    }

    // Update is called once per frame
    void Update()
    {
        healthBar.fillAmount = (float)HealthCurrent / (float)HealthMax;
        healthText.text = HealthCurrent.ToString() + "/" +HealthMax.ToString();
    }

Código (PlayerController.cs):

...
    // 定义角色血量
    public int health;
    // Start is called before the first frame update
    private void Start()
    {

       ...
        HealthUI.HealthMax = health;
    }

...

Execute e veja:

Há um BUG: HP não é inicializado após a execução, ou a inicialização falha e não mostra o status do sangue total.

 Depois de batido, ele volta ao normal, o que significa que a função Atualizar é executada com sucesso e pode alterar a alteração e a proporção da barra de sangue.

Acho que este é um problema lógico. Em primeiro lugar, a interface do usuário do volume de sangue deve ser anexada ao jogador. O personagem e o script do jogador devem ser inicializados no início do jogo. Após a conclusão da inicialização, a interface do usuário do volume de sangue e outros componentes auxiliares devem estar disponíveis. Vá buscar os valores e componentes no player, e agora sei que a inicialização do player está concluída e o HP é dado à variável estática do HP através da execução, mas pode ser disse que o Start da UI pode ser inicializado ao mesmo tempo que o jogador (porque ambos é o primeiro frame, vamos pensar assim), e é completado no primeiro frame, então quando a UI é inicializada, HealthCurrent = HealthMax; o que você obtém é na verdade o valor padrão, e o valor padrão da variável int é 0, então ele exibe 0 quando eu clico em Run /100, quando ele foi atingido, ele chamou o valor dado pelo jogador e voltou ao normal.

Solução violenta: Aumente a prioridade do player, deixe ele completar a inicialização com antecedência, dê o valor para Hp, e depois inicialize o hp novamente, isso pode resolver o problema, basta mudar o Start no player para Awake.

Solução recomendada: não altere o código, clique no arquivo do script, abra as configurações do projeto, clique na ordem de execução do script e arraste para esta caixa todos os scripts que precisam ser executados na ordem. Quanto menor o valor, mais rápido a execução.

Método 1 Explicação: Unity é uma operação de encadeamento único. A chamada co-rotina é semelhante à multiencadeada, mas na verdade é executada por um único encadeamento. A ordem de execução das funções no script de unidade é a seguinte: Awake> OnEable>Iniciar>FixedUpdate>Update>LateUpdate
> OnGUI>Reset>OnDisable>OnDestroy

Captura de tela do método 2:

ERRO foi corrigido.

 

 

Acho que você gosta

Origin blog.csdn.net/Joker6578/article/details/127954239
Recomendado
Clasificación