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.