Ajuda em Script de Verificação de Ação e Reação
3 participantes
Página 1 de 1
Ajuda em Script de Verificação de Ação e Reação
Estou com problemas nesse script que criei, eu gostaria que se a tal ação acontecesse, a reação fosse ativada. Mas isso não ocorre. Não quero que o script faça a ação acontecer, quero que ela verifique se a ação ocorreu e então ative a reação.
Segue o Script:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class ActionReactionManager : MonoBehaviour
{
[System.Serializable]
public class Action
{
public GameObject targetObject;
public UnityEvent actionEvent;
}
[System.Serializable]
public class Reaction
{
public GameObject targetObject;
public UnityEvent reactionEvent;
}
public List<Action> actions = new List<Action>();
public List<Reaction> reactions = new List<Reaction>();
public void SetAction(GameObject targetObject, UnityEvent actionEvent)
{
Action newAction = new Action();
newAction.targetObject = targetObject;
newAction.actionEvent = actionEvent;
// Adiciona a nova ação à lista de ações
actions.Add(newAction);
}
public void SetReaction(GameObject targetObject, UnityEvent reactionEvent)
{
Reaction newReaction = new Reaction();
newReaction.targetObject = targetObject;
newReaction.reactionEvent = reactionEvent;
// Adiciona a nova reação à lista de reações
reactions.Add(newReaction);
}
public void ExecuteReactions()
{
// Percorre todas as ações definidas
foreach (Action action in actions)
{
// Verifica se o objeto alvo da ação está ativo
if (action.targetObject.activeSelf)
{
// Se a ação ocorreu, encontra a reação correspondente
foreach (Reaction reaction in reactions)
{
// Se o objeto alvo da reação for o mesmo da ação
if (reaction.targetObject == action.targetObject)
{
// Aciona a reação correspondente
reaction.reactionEvent.Invoke();
}
}
}
}
}
}
Segue o Script:
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public class ActionReactionManager : MonoBehaviour
{
[System.Serializable]
public class Action
{
public GameObject targetObject;
public UnityEvent actionEvent;
}
[System.Serializable]
public class Reaction
{
public GameObject targetObject;
public UnityEvent reactionEvent;
}
public List<Action> actions = new List<Action>();
public List<Reaction> reactions = new List<Reaction>();
public void SetAction(GameObject targetObject, UnityEvent actionEvent)
{
Action newAction = new Action();
newAction.targetObject = targetObject;
newAction.actionEvent = actionEvent;
// Adiciona a nova ação à lista de ações
actions.Add(newAction);
}
public void SetReaction(GameObject targetObject, UnityEvent reactionEvent)
{
Reaction newReaction = new Reaction();
newReaction.targetObject = targetObject;
newReaction.reactionEvent = reactionEvent;
// Adiciona a nova reação à lista de reações
reactions.Add(newReaction);
}
public void ExecuteReactions()
{
// Percorre todas as ações definidas
foreach (Action action in actions)
{
// Verifica se o objeto alvo da ação está ativo
if (action.targetObject.activeSelf)
{
// Se a ação ocorreu, encontra a reação correspondente
foreach (Reaction reaction in reactions)
{
// Se o objeto alvo da reação for o mesmo da ação
if (reaction.targetObject == action.targetObject)
{
// Aciona a reação correspondente
reaction.reactionEvent.Invoke();
}
}
}
}
}
}
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Re: Ajuda em Script de Verificação de Ação e Reação
na verdade o interessante é colocar uma bool aqui:
[System.Serializable]
public class Action
{
public GameObject targetObject;
public UnityEvent actionEvent;
public bool sofreuReacao;
}
para marcar no forloop a cada ação que já sofreu reação, e não ficar chamando infinitamente.
no caso do script geral vou fornecer outro mais simples, pegue como base:
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
public class AcaoReacao : MonoBehaviour
{
public List<reacao> minhasReacoes;
public List<acao> minhasAcoes;
[Serializable]
public class reacao
{
public string nomeReacao;
//.... adiicone outras propriedades
}
[Serializable]
public class acao
{
public reacao minhaReacaoCorrespondente;
public bool sofreuReacao;
}
void Update()
{
for (int i = 0; i < minhasAcoes.Count; i++)
{
//====SÓ LEIO O FORLOOP SE ESSA MINHA ACAO NÃO SOFREU REACAO AINDA
if ( minhasAcoes[i].sofreuReacao ==false)
{
// PARA CADA REACAO NA LISTA, VOU VER SE TEM ALGUMA IGUAL A PEDIDA PELA ACAO
for (int o = 0; o < minhasReacoes.Count; o++)
{
//VERIFICA SE A REACAO PEDIDA PARA A MINHA ACAO É IGUAL A REACAO DA LISTA DE REACOES;
if (minhasReacoes[o].nomeReacao == minhasAcoes[i].minhaReacaoCorrespondente.nomeReacao)
{
minhasAcoes[i].sofreuReacao =true;
break;
}
}
}
}
}
}
[System.Serializable]
public class Action
{
public GameObject targetObject;
public UnityEvent actionEvent;
public bool sofreuReacao;
}
para marcar no forloop a cada ação que já sofreu reação, e não ficar chamando infinitamente.
no caso do script geral vou fornecer outro mais simples, pegue como base:
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
public class AcaoReacao : MonoBehaviour
{
public List<reacao> minhasReacoes;
public List<acao> minhasAcoes;
[Serializable]
public class reacao
{
public string nomeReacao;
//.... adiicone outras propriedades
}
[Serializable]
public class acao
{
public reacao minhaReacaoCorrespondente;
public bool sofreuReacao;
}
void Update()
{
for (int i = 0; i < minhasAcoes.Count; i++)
{
//====SÓ LEIO O FORLOOP SE ESSA MINHA ACAO NÃO SOFREU REACAO AINDA
if ( minhasAcoes[i].sofreuReacao ==false)
{
// PARA CADA REACAO NA LISTA, VOU VER SE TEM ALGUMA IGUAL A PEDIDA PELA ACAO
for (int o = 0; o < minhasReacoes.Count; o++)
{
//VERIFICA SE A REACAO PEDIDA PARA A MINHA ACAO É IGUAL A REACAO DA LISTA DE REACOES;
if (minhasReacoes[o].nomeReacao == minhasAcoes[i].minhaReacaoCorrespondente.nomeReacao)
{
minhasAcoes[i].sofreuReacao =true;
break;
}
}
}
}
}
}
Re: Ajuda em Script de Verificação de Ação e Reação
Valeu. Muito obrigado. Vou testar aqui.
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Re: Ajuda em Script de Verificação de Ação e Reação
Não era exatamente isso. Aqui ele pede um Element, e eu quero que continua com antes como uma opção runtime onde eu possa definir o objeto, a ação que ele irá realizar, e o mesmo para a Reação.stratengine escreveu:na verdade o interessante é colocar uma bool aqui:
[System.Serializable]
public class Action
{
public GameObject targetObject;
public UnityEvent actionEvent;
public bool sofreuReacao;
}
para marcar no forloop a cada ação que já sofreu reação, e não ficar chamando infinitamente.
no caso do script geral vou fornecer outro mais simples, pegue como base:
using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;
public class AcaoReacao : MonoBehaviour
{
public List<reacao> minhasReacoes;
public List<acao> minhasAcoes;
[Serializable]
public class reacao
{
public string nomeReacao;
//.... adiicone outras propriedades
}
[Serializable]
public class acao
{
public reacao minhaReacaoCorrespondente;
public bool sofreuReacao;
}
void Update()
{
for (int i = 0; i < minhasAcoes.Count; i++)
{
//====SÓ LEIO O FORLOOP SE ESSA MINHA ACAO NÃO SOFREU REACAO AINDA
if ( minhasAcoes[i].sofreuReacao ==false)
{
// PARA CADA REACAO NA LISTA, VOU VER SE TEM ALGUMA IGUAL A PEDIDA PELA ACAO
for (int o = 0; o < minhasReacoes.Count; o++)
{
//VERIFICA SE A REACAO PEDIDA PARA A MINHA ACAO É IGUAL A REACAO DA LISTA DE REACOES;
if (minhasReacoes[o].nomeReacao == minhasAcoes[i].minhaReacaoCorrespondente.nomeReacao)
{
minhasAcoes[i].sofreuReacao =true;
break;
}
}
}
}
}
}
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Re: Ajuda em Script de Verificação de Ação e Reação
me descreva de forma simples o passo a passo do que você precisa fazer. Que ai posso ver como ajudar. No caso como seria esse controle que você precisa?
Re: Ajuda em Script de Verificação de Ação e Reação
Esse script eu vou adicionar a um objetivo, mais precisamente um inimigo, que ao morrer irá deixar um item. Já tenho o inimigo funcionando corretamente, só preciso desse script de dropar o item. Ele funciona de forma simples. Quando o inimigo morrer, ele ativa o item que é um objeto que está com ele de forma inativa ainda.
O script precisa ter uma opção runtime em que eu escolho um objeto e depois sua ação, nessa parte o script verifica se tal ação ocorreu, exemplo, a morte do inimigo. Se ocorreu uma reação irá acontecer, que será a ativação do item, que se dá no runtime tbm, onde eu escolho o objeto e escolho sua função, que será ativar o item.
O script precisa ter uma opção runtime em que eu escolho um objeto e depois sua ação, nessa parte o script verifica se tal ação ocorreu, exemplo, a morte do inimigo. Se ocorreu uma reação irá acontecer, que será a ativação do item, que se dá no runtime tbm, onde eu escolho o objeto e escolho sua função, que será ativar o item.
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Re: Ajuda em Script de Verificação de Ação e Reação
Não está bem explícito como vc está gerenciando a chamada de "Ações" mas vc pode criar uma bool na classe de actions chamada "called" pra validar se aquela ação já foi executada.
Toda vez q vc chamar uma ação vc pode setar essa bool pra true. (Dependendo de como vc tá fazendo a chamada dessas actions, pode ser algo até mais automático do q ficar mudando o valor dessa bool).
Daí dei uma enxugada no método "ExecuteReactions" pra vc:
No foreach ele só procura por ações que já foram executadas (called é true) E que o target está ativo.
Quando encontra a action nessas condições, ele procura pela Reaction correspondente (se o target dela é igual ao target da action) se sim, (o objeto é diferente de nulo) ele dispara o evento da reação.
Acho interessante vc deletar a action da lista depois que a reação dela for disparada, se não vai executar ela de novo numa próxima chamada de "ExecuteReactions".
Toda vez q vc chamar uma ação vc pode setar essa bool pra true. (Dependendo de como vc tá fazendo a chamada dessas actions, pode ser algo até mais automático do q ficar mudando o valor dessa bool).
Daí dei uma enxugada no método "ExecuteReactions" pra vc:
- Código:
public void ExecuteReactions()
{
foreach (Action action in
actions.Where(a => a.called && a.targetObject.activeSelf))
{
Reaction reactionToRise = reactions.FirstOrDefault(r =>
r.targetObject == action.targetObject);
reactionToRise?.reactionEvent?.Invoke();
}
}
No foreach ele só procura por ações que já foram executadas (called é true) E que o target está ativo.
Quando encontra a action nessas condições, ele procura pela Reaction correspondente (se o target dela é igual ao target da action) se sim, (o objeto é diferente de nulo) ele dispara o evento da reação.
Acho interessante vc deletar a action da lista depois que a reação dela for disparada, se não vai executar ela de novo numa próxima chamada de "ExecuteReactions".
Re: Ajuda em Script de Verificação de Ação e Reação
O que estou tentando fazer é como o exemplo da imagem:
Quero que o códido tenha essas opções tanto pra mim escolher a ação tanto para a reação que irá receber.
Quero que o códido tenha essas opções tanto pra mim escolher a ação tanto para a reação que irá receber.
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Re: Ajuda em Script de Verificação de Ação e Reação
Link da imagem:
https://1drv.ms/i/s!AvXq7LLDFi16yBRjAcpUU23e6hQC?e=fPx0KR
https://1drv.ms/i/s!AvXq7LLDFi16yBRjAcpUU23e6hQC?e=fPx0KR
Triskal- Avançado
- PONTOS : 1458
REPUTAÇÃO : 7
Respeito as regras :
Tópicos semelhantes
» (Ajuda) Verificação do cronômetro
» Ajuda Urgente como chamo a animação no script alguém poderia dar uma ajuda???
» [AJUDA] movimentação e ação do Player
» Ajuda - Apertar botao e executar uma ação
» [ AJUDA] Estou com problemas para acessar índice de uma Lista e realizar uma acao
» Ajuda Urgente como chamo a animação no script alguém poderia dar uma ajuda???
» [AJUDA] movimentação e ação do Player
» Ajuda - Apertar botao e executar uma ação
» [ AJUDA] Estou com problemas para acessar índice de uma Lista e realizar uma acao
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos