Estruturas de dados são como codificadores armazenam e organizam conjuntos inteiros de dados. No Lua, estruturas de dados são criadas com tabelas. Tabelas podem conter qualquer número de valores.
Este artigo cobre o uso de matrizes , um digitarespecífico de tabela, para criar um personagem falante.
Mesas
As tabelas são tipos de dados que podem conter vários valores. Ao contrário de outros tipos de dados que armazenam um único valor, as tabelas não têm um tamanho fixo e podem conter uma mistura de diferentes tipos de valores. Com as tabelas, você pode armazenar itens no inventário de um jogador ou criar uma lista de milhares de nomes de jogadores.
Matrizes
Existem diferentes tipos de tabelas. Um tipo é uma matriz **** , que armazena listas de valores em uma ordem específica. Para criar uma matriz / lista, crie uma variável e atribua-lhe colchetes { }. Separe os valores entre colchetes com vírgulas como abaixo:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
Criando um Personagem Falante
Para explorar matrizes, você vai trabalhar com um personagem não jogável (NPC) que, quando clicado, mostra uma linha de diálogo diferente.
Este projeto usará um modelo NPC pré-fabricado, que inclui um script parcial e um Detector de Prompt, mas carece de diálogo.
No Explorador, importe o NPC clicando com o botão direito do mouse em Workspace > Insert From File e selecionando o arquivo baixado.
Codificando uma matriz de diálogo
Esses passos usam uma matriz para armazenar diferentes frases para o NPC dizer quando os jogadores interagem com ele.
No Explorer , vá para NPC > ProximityPrompt > ChatManager.
No ChatManager, onde marcado no script, crie uma matriz vazia **** para armazenar opções de diálogo.
-- Cicla através do diálogo de bate-papo quando o prompt é usadolocal Chat = game:GetService("Chat")local prompt = script.Parentlocal npc = prompt.Parentlocal characterParts = npc.CharacterPartslocal head = characterParts.Head-- Adicionar matriz aquilocal dialogueArray = {}local function speak()local dialogue = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)Dentro dos parênteses {} da matriz recém-criada, digite pelo menos três cadeias de diálogo, separadas por vírgulas.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
Usando Índices de Arrays
Cada valor na matriz é atribuído um número index. Os índices são atribuídos a valores na ordem em que os valores são armazenados. O primeiro valor está no índice 1, o segundo no índice 2 e assim por diante.
Algumas linguagens de codificação, como Java, começam os índices em 0.
Na matriz recém-criada, "Hi" está no índice 1 e "Goodbye!" está no índice 3.
Índice | Valor |
---|---|
1 vez | Hola |
2 veces | ¡Hoy es un gran día! |
3 veces | ¡Adiós! |
Usando Valores de Índice Específicos
Use valores de índice para atribuir partes específicas de diálogo ao NPC. Para usar um valor em um índice específico, adicione o índice entre colchetes diretamente após o nome da matriz / lista, como dialogueArray[1] .
Substitua o valor padrão da string da variável dialogue pelo índice 2.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endPlaytest e clique no NPC. O segundo valor da matriz deve aparecer na bolha de bate-papo. Tente alterar o código para testar cada valor na tabela.
Mudando Linhas de Dialogo
Quando o jogador interage com o NPC, o NPC sempre dirá a mesma linha. Isso é chato. Em vez disso, use uma variável para atualizar qual valor de índice usar.
Sempre que um jogador interage com o NPC, aumente o valor da variável em 1 para exibir a próxima linha de diálogo.
Para acompanhar o índice atual, adicione uma nova variável chamada dialogueIndex . Defina a variável para 1 para começar no início da matriz / lista.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1Em speak() , substitua o número do índice em dialogueArray[2] com a variável que você acabou de criar.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)endNa parte inferior da função, adicione 1 a dialogueIndex . Na próxima vez que speak() for chamado, a caixa de diálogo exibirá a próxima string / cadeia / texto.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endJogue o teste e clique no NPC para ver cada cadeia de diálogo da matriz / lista.
Observe que há um erro **** na Janela de Saída quando o script chega ao final da matriz / lista.
Você vai consertar isso na próxima seção para que o diálogo reinicie do começo depois de mostrar a última string / cadeia / texto.
Tamanhos da Matriz
Você pode usar o tamanho da matriz para saber quando redefinir o índice desejado para 1. Encontre o tamanho **** de uma matriz digitando # , sem espaços, antes do nome da matriz / lista.
Por exemplo: #dialogueArray
Verifique o tamanho da matriz / listaem relação ao valor atual da variável para saber quando é hora de começar de novo no começo.
Reiniciando o Diálogo
Use o tamanho da matriz para verificar quando é hora de voltar ao primeiro diálogo.
Adicione uma declaração if e verifique se dialogueIndex é igual a #dialogueArray , o tamanho total desta matriz / lista. Se sim, defina dialogueIndex para 1.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endSe dialogueIndex não estiver no terminar/parar/sair, ele ainda deve adicionar 1 a dialogueIndex . Mova dialogueIndex += 1 sob uma instrução else.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1elsedialogueIndex += 1endendJogue e confirme que você pode recomeçar o diálogo.
Resumo
Estruturas de dados são como conjuntos de dados são armazenados. Lua usa tabelas para criar estruturas de dados. Matrizes são um tipo de tabela que pode conter listas ordenadas de informações. Cada valor dentro da matriz é atribuído um número de índice, começando com o índice 1.
Este script usou uma matriz para criar uma lista de possíveis linhas de diálogo para um personagem não jogável (NPC).
scriptconcluído
-- Cicla através do diálogo de bate-papo quando o prompt é usado
local Chat = game:GetService("Chat")
local prompt = script.Parent
local npc = prompt.Parent
local characterParts = npc.CharacterParts
local head = characterParts.Head
-- Adicionar matriz aqui
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
local dialogueIndex = 1
local function speak()
local dialogue = dialogueArray[dialogueIndex]
Chat:Chat(head, dialogue)
if dialogueIndex == #dialogueArray then
dialogueIndex = 1
else
dialogueIndex += 1
end
end
prompt.Triggered:Connect(speak)
Dicas de solução de problemas
Se o personagem não passar pelo conjunto de diálogos, tente as seguintes dicas de solução de problemas.
- Verifique a declaração if que dialogueIndex está definido como 1. Na declaração else, verifique se dialogueIndex tem 1 adicionado a si mesmo.
- Ao obter o tamanho da matriz / lista, certifique-se de que não haja espaços após o # em #dialogueArray.
Desafios Opcionais
Tente um dos desafios opcionais abaixo.
- Codifique o script para que o diálogo do NPC passe para trás através da matriz / lista. O dialogueIndex deve começar na matriz e subtrair cada vez em vez de adicionar.
- Em vez de mostrar o diálogo em ordem, peça ao NPC que mostre uma linha aleatória de diálogo cada vez que usar Random.new(). Um script de exemplo está incluído abaixo para referência
local randomGenerator = Random.new()
-- Mostra um novo diálogo sempre que o NPC é clicado
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end