[RESOLVIDO] Não consigo ativar/desativar um script através de outro
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Não consigo ativar/desativar um script através de outro
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HabilitarComponente31 : MonoBehaviour
{
public FirstPersonController firstPersonController;
public void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
firstPersonController.GetComponent<FirstPersonController>().enabled = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
firstPersonController.GetComponent<FirstPersonController>().enabled = false;
}
}
}
- Código:
using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;
using UnityStandardAssets.Utility;
using Random = UnityEngine.Random;
[Serializable]
public class SomPassos{
public string tagchao;
public AudioClip[] audios;
}
namespace UnityStandardAssets.Characters.FirstPerson
{
[RequireComponent(typeof (CharacterController))]
[RequireComponent(typeof (AudioSource))]
public class FirstPersonController : MonoBehaviour
{
[SerializeField] private bool m_IsWalking;
[SerializeField] private float m_WalkSpeed;
[SerializeField] private float m_RunSpeed;
[SerializeField] [Range(0f, 1f)] private float m_RunstepLenghten;
[SerializeField] private float m_JumpSpeed;
[SerializeField] private float m_StickToGroundForce;
[SerializeField] private float m_GravityMultiplier;
[SerializeField] private MouseLook m_MouseLook;
[SerializeField] private bool m_UseFovKick;
[SerializeField] private FOVKick m_FovKick = new FOVKick();
[SerializeField] private bool m_UseHeadBob;
[SerializeField] private CurveControlledBob m_HeadBob = new CurveControlledBob();
[SerializeField] private LerpControlledBob m_JumpBob = new LerpControlledBob();
[SerializeField] private float m_StepInterval;
[Space(10)]
public AudioClip[] SomPassosPadrao;
public SomPassos[] SomDosPassos;
string tagAtual;
[Space(10)]
[SerializeField] private AudioClip m_JumpSound; // the sound played when character leaves the ground.
[SerializeField] private AudioClip m_LandSound; // the sound played when character touches back on ground.
private Camera m_Camera;
private bool m_Jump;
private float m_YRotation;
private Vector2 m_Input;
private Vector3 m_MoveDir = Vector3.zero;
private CharacterController m_CharacterController;
private CollisionFlags m_CollisionFlags;
private bool m_PreviouslyGrounded;
private Vector3 m_OriginalCameraPosition;
private float m_StepCycle;
private float m_NextStep;
private bool m_Jumping;
private AudioSource m_AudioSource;
// Use this for initialization
private void Start()
{
m_CharacterController = GetComponent<CharacterController>();
m_Camera = Camera.main;
m_OriginalCameraPosition = m_Camera.transform.localPosition;
m_FovKick.Setup(m_Camera);
m_HeadBob.Setup(m_Camera, m_StepInterval);
m_StepCycle = 0f;
m_NextStep = m_StepCycle/2f;
m_Jumping = false;
m_AudioSource = GetComponent<AudioSource>();
m_MouseLook.Init(transform , m_Camera.transform);
}
// Update is called once per frame
private void Update()
{
RotateView();
// the jump state needs to read here to make sure it is not missed
if (!m_Jump)
{
m_Jump = CrossPlatformInputManager.GetButtonDown("Jump");
}
if (!m_PreviouslyGrounded && m_CharacterController.isGrounded)
{
StartCoroutine(m_JumpBob.DoBobCycle());
PlayLandingSound();
m_MoveDir.y = 0f;
m_Jumping = false;
}
if (!m_CharacterController.isGrounded && !m_Jumping && m_PreviouslyGrounded)
{
m_MoveDir.y = 0f;
}
m_PreviouslyGrounded = m_CharacterController.isGrounded;
}
private void PlayLandingSound()
{
m_AudioSource.clip = m_LandSound;
m_AudioSource.Play();
m_NextStep = m_StepCycle + .5f;
}
private void FixedUpdate()
{
float speed;
GetInput(out speed);
// always move along the camera forward as it is the direction that it being aimed at
Vector3 desiredMove = transform.forward*m_Input.y + transform.right*m_Input.x;
// get a normal for the surface that is being touched to move along it
RaycastHit hitInfo;
Physics.SphereCast(transform.position, m_CharacterController.radius, Vector3.down, out hitInfo,
m_CharacterController.height/2f, Physics.AllLayers, QueryTriggerInteraction.Ignore);
desiredMove = Vector3.ProjectOnPlane(desiredMove, hitInfo.normal).normalized;
m_MoveDir.x = desiredMove.x*speed;
m_MoveDir.z = desiredMove.z*speed;
if (m_CharacterController.isGrounded)
{
m_MoveDir.y = -m_StickToGroundForce;
if (m_Jump)
{
m_MoveDir.y = m_JumpSpeed;
PlayJumpSound();
m_Jump = false;
m_Jumping = true;
}
}
else
{
m_MoveDir += Physics.gravity*m_GravityMultiplier*Time.fixedDeltaTime;
}
m_CollisionFlags = m_CharacterController.Move(m_MoveDir*Time.fixedDeltaTime);
ProgressStepCycle(speed);
UpdateCameraPosition(speed);
m_MouseLook.UpdateCursorLock();
}
private void PlayJumpSound()
{
m_AudioSource.clip = m_JumpSound;
m_AudioSource.Play();
}
private void ProgressStepCycle(float speed)
{
if (m_CharacterController.velocity.sqrMagnitude > 0 && (m_Input.x != 0 || m_Input.y != 0))
{
m_StepCycle += (m_CharacterController.velocity.magnitude + (speed*(m_IsWalking ? 1f : m_RunstepLenghten)))*
Time.fixedDeltaTime;
}
if (!(m_StepCycle > m_NextStep))
{
return;
}
m_NextStep = m_StepCycle + m_StepInterval;
PlayFootStepAudio();
}
private void PlayFootStepAudio()
{
if (!m_CharacterController.isGrounded)
{
return;
}
if (tagAtual != "Untagged") {
for (int x = 0; x < SomDosPassos.Length; x++) {
if (tagAtual == SomDosPassos [x].tagchao) {
if (SomDosPassos [x].audios.Length > 1) {
int n = Random.Range (1, SomDosPassos [x].audios.Length);
m_AudioSource.clip = SomDosPassos [x].audios [n];
m_AudioSource.PlayOneShot (m_AudioSource.clip);
SomDosPassos [x].audios [n] = SomDosPassos [x].audios [0];
SomDosPassos [x].audios [0] = m_AudioSource.clip;
} else {
m_AudioSource.clip = SomDosPassos [x].audios [0];
m_AudioSource.PlayOneShot (m_AudioSource.clip);
}
break;
}
}
}
else {
if (SomPassosPadrao.Length > 1) {
int n = Random.Range (1, SomPassosPadrao.Length);
m_AudioSource.clip = SomPassosPadrao [n];
m_AudioSource.PlayOneShot (m_AudioSource.clip);
SomPassosPadrao [n] = SomPassosPadrao [0];
SomPassosPadrao [0] = m_AudioSource.clip;
} else {
m_AudioSource.clip = SomPassosPadrao[0];
m_AudioSource.PlayOneShot (m_AudioSource.clip);
}
}
}
private void UpdateCameraPosition(float speed)
{
Vector3 newCameraPosition;
if (!m_UseHeadBob)
{
return;
}
if (m_CharacterController.velocity.magnitude > 0 && m_CharacterController.isGrounded)
{
m_Camera.transform.localPosition =
m_HeadBob.DoHeadBob(m_CharacterController.velocity.magnitude +
(speed*(m_IsWalking ? 1f : m_RunstepLenghten)));
newCameraPosition = m_Camera.transform.localPosition;
newCameraPosition.y = m_Camera.transform.localPosition.y - m_JumpBob.Offset();
}
else
{
newCameraPosition = m_Camera.transform.localPosition;
newCameraPosition.y = m_OriginalCameraPosition.y - m_JumpBob.Offset();
}
m_Camera.transform.localPosition = newCameraPosition;
}
private void GetInput(out float speed)
{
// Read input
float horizontal = CrossPlatformInputManager.GetAxis("Horizontal");
float vertical = CrossPlatformInputManager.GetAxis("Vertical");
bool waswalking = m_IsWalking;
#if !MOBILE_INPUT
// On standalone builds, walk/run speed is modified by a key press.
// keep track of whether or not the character is walking or running
m_IsWalking = !Input.GetKey(KeyCode.LeftShift);
#endif
// set the desired speed to be walking or running
speed = m_IsWalking ? m_WalkSpeed : m_RunSpeed;
m_Input = new Vector2(horizontal, vertical);
// normalize input if it exceeds 1 in combined length:
if (m_Input.sqrMagnitude > 1)
{
m_Input.Normalize();
}
// handle speed change to give an fov kick
// only if the player is going to a run, is running and the fovkick is to be used
if (m_IsWalking != waswalking && m_UseFovKick && m_CharacterController.velocity.sqrMagnitude > 0)
{
StopAllCoroutines();
StartCoroutine(!m_IsWalking ? m_FovKick.FOVKickUp() : m_FovKick.FOVKickDown());
}
}
private void RotateView()
{
m_MouseLook.LookRotation (transform, m_Camera.transform);
}
private void OnControllerColliderHit(ControllerColliderHit hit)
{
tagAtual = hit.transform.tag;
Rigidbody body = hit.collider.attachedRigidbody;
//dont move the rigidbody if the character is on top of it
if (m_CollisionFlags == CollisionFlags.Below)
{
return;
}
if (body == null || body.isKinematic)
{
return;
}
body.AddForceAtPosition(m_CharacterController.velocity*0.1f, hit.point, ForceMode.Impulse);
}
}
}
Se souberem o que há de errado eu agradeço pela ajuda.
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Debuga "HabilitarComponente31", vê se o Script está entrando nos blocos certinho
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Me perdoe a ignorância, mas como se faz isso? É na Unity ou no editor de script?
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Desculpe a demora, só vi agr.
vc faz prints mesmo, tipo assim:
Eu debugo meu código assim, coloco o nome da Classe, depois do Método e depois da variável que eu quero saber o que está acontecendo com ela.
Esses prints vc vai ver na aba "Console" na Unity. Geralmente essa aba fica junto da aba "Project" que fica do lado esquerdo da tela, no canto inferior. Isso é pra vc saber como o fluxo do seu Script está, o que está rodando ou não.. enfim.
Pode ser que o enabled não esteja funcionando por que vc não está nem entrando no bloco que vc checa o "Player".
Dá retorno aqui pra saber o resultado.
vc faz prints mesmo, tipo assim:
- Código:
public class HabilitarComponente31 : MonoBehaviour
{
public FirstPersonController firstPersonController;
public void OnTriggerEnter(Collider other)
{
// Pra vc saber qual o nome do "other"
print("HabilitarComponente31 ::: OnTriggerEnter() ::: other ::: " + other);
if (other.CompareTag("Player"))
{
// Pra ver se entrou nesse bloco
print("HabilitarComponente31 ::: OnTriggerEnter() ::: other ::: Entrou nesse bloco");
firstPersonController.GetComponent<FirstPersonController>().enabled = true;
}
}
void OnTriggerExit(Collider other)
{
// Pra vc saber qual o nome do "other"
print("HabilitarComponente31 ::: OnTriggerExit() ::: other ::: " + other);
if (other.CompareTag("Player"))
{
// Pra ver se entrou nesse bloco
print("HabilitarComponente31 ::: OnTriggerExit() ::: other ::: Entrou nesse bloco");
firstPersonController.GetComponent<FirstPersonController>().enabled = false;
}
}
}
Eu debugo meu código assim, coloco o nome da Classe, depois do Método e depois da variável que eu quero saber o que está acontecendo com ela.
Esses prints vc vai ver na aba "Console" na Unity. Geralmente essa aba fica junto da aba "Project" que fica do lado esquerdo da tela, no canto inferior. Isso é pra vc saber como o fluxo do seu Script está, o que está rodando ou não.. enfim.
Pode ser que o enabled não esteja funcionando por que vc não está nem entrando no bloco que vc checa o "Player".
Dá retorno aqui pra saber o resultado.
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Valeu pelas dicas, no console da Unity não aparece nada sobre o script, o Visual Studio não diz que há algo errado. É estranho, pois eu uso esse mesmo script e funciona normalmente, mas pare o FirstPersonController não funciona. Abaixo está outra variação do mesmo script.
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HablitarComponente2 : MonoBehaviour
{
public GameObjectControler myGameObjectControler;
public void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
myGameObjectControler.GetComponent<GameObjectControler>().enabled = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
myGameObjectControler.GetComponent<GameObjectControler>().enabled = false;
}
}
}
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Quando vc coloca o Print, o que estiver dentro dos parâmetros será impresso no Console. Se vc diz "no console da Unity não aparece nada sobre o script" o que eu entendo é que o Trigger não está nem funcionando. Vc tem certeza que marcou o Trigger no Box Collider?
Última edição por WLCS22 em Dom Mar 06, 2022 1:11 am, editado 4 vez(es)
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Ahh já sei o que pode ser tbm. Vc tem que colocar o Script em um Objeto na Scene (pode ser um GameObject Empty mesmo), linkar esse Objeto a um atributo do tipo GameObject em "HablitarComponente2" (sugeri "objQueContemOScript") e depois disso eh que vc pega o Componente "GameObjectControler" dentro do Start():
- Código:
public class HablitarComponente2 : MonoBehaviour
{
public GameObject objQueContemOScript;// O Objeto que está na Scene
public GameObjectControler myGameObjectControler;// O outro Script
void Start(){
// É assim que vc vai pegar o outro Script
myGameObjectControler = objQueContemOScript.GetComponent<GameObjectControler>();
}
public void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
// Pra vc saber o nome que está sendo pelo no "other"
print("HablitarComponente2 ::: OnTriggerEnter()");
myGameObjectControler.enabled = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
// Pra vc saber o nome que está sendo pelo no "other"
print("HablitarComponente2 ::: OnTriggerExit()");
myGameObjectControler.enabled = false;
}
}
}
Última edição por WLCS22 em Dom Mar 06, 2022 1:14 am, editado 4 vez(es)
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Infelizmente ainda não obtive êxito, eu esqueci de mencionar que quando eu arrasto o FPSController para o seu lugar no script no inspector a coisa não funciona, não aparece aquele simbolo de proibido, um círculo com uma faixa na diagonal, eu até consigo colocá-lo ali, mas ele não permanece lá, é como se eu não tivesse feito nada.
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Sim, eu marquei a opção Trigger no Collider.WLCS22 escreveu:Quando vc coloca o Print, o que estiver dentro dos parâmetros será impresso no Console. Se vc diz "no console da Unity não aparece nada sobre o script" o que eu entendo é que o Trigger não está nem funcionando. Vc tem certeza que marcou o Trigger no Box Collider?
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Mas, tipo, vc conseguiu acessar o outro Script pra ativar/desativar ele?
Não estou entendendo que símbolo é esse que vc está falando no Inspector, esse "não aparece aquele simbolo de proibido, um círculo com uma faixa na diagonal".
Olha, quando eu fazia uma coisa no Script pra um certo personagem fazer certa ação e ele não fazia, sempre era uma bool que eu achava que estava, por exemplo, true, mas na verdade estava false, ou vice-versa.
Tipo, eu fiz uma bool de nome "podeSeDeslocar" e deixei ela true em um Método para que o personagem se desloque quando eu chamasse esse Método. Mas eu também deixei essa bool false em outro Método para usá-la quando eu quisesse que o personagem não se deslocasse. Acontecia que eu tava chamando o Método em que essa bool estava true, mas esquecia de cortar o fluxo no Update do Método em que essa bool estava false. Daí toda vez eu dava o comando pro personagem se deslocar (a bool true), ele nunca saia do lugar justamente por que o outro Método em que a bool estava false estava rodando no update ao mesmo tempo. Ciente disso eu tratava essa bool de forma a não ter esse conflito. Não sei se vc entendeu oq falei. Se entendeu, dá uma checada nas variáveis que vc está usando pra dar seus comandos.
Me diz se vc conseguiu acessar/ativar/desativar o outro script pra saber se o trigger está funcionando ou não.
Não estou entendendo que símbolo é esse que vc está falando no Inspector, esse "não aparece aquele simbolo de proibido, um círculo com uma faixa na diagonal".
Olha, quando eu fazia uma coisa no Script pra um certo personagem fazer certa ação e ele não fazia, sempre era uma bool que eu achava que estava, por exemplo, true, mas na verdade estava false, ou vice-versa.
Tipo, eu fiz uma bool de nome "podeSeDeslocar" e deixei ela true em um Método para que o personagem se desloque quando eu chamasse esse Método. Mas eu também deixei essa bool false em outro Método para usá-la quando eu quisesse que o personagem não se deslocasse. Acontecia que eu tava chamando o Método em que essa bool estava true, mas esquecia de cortar o fluxo no Update do Método em que essa bool estava false. Daí toda vez eu dava o comando pro personagem se deslocar (a bool true), ele nunca saia do lugar justamente por que o outro Método em que a bool estava false estava rodando no update ao mesmo tempo. Ciente disso eu tratava essa bool de forma a não ter esse conflito. Não sei se vc entendeu oq falei. Se entendeu, dá uma checada nas variáveis que vc está usando pra dar seus comandos.
Me diz se vc conseguiu acessar/ativar/desativar o outro script pra saber se o trigger está funcionando ou não.
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Para ser sincero eu entendo muito pouco de C# (quase nada) por isso mesmo que eu estava procurando alguém para fazer esse serviço para mim (unir ambos os scripts), pois eu não faço a mínima ideia de como fazer isso. Creio que o "problema" esteja no script do Player, pois outros podem ser chamados e ele não. Sobre o símbolo de proibido; ele aparece, por exemplo, se você pedir um Collider no script e tentar arrastar um Rigbody para lá. No meu caso, esse símbolo não aparece, porém, ao arrastar o GameObject contendo o FirstPersonController não ocorre nada, é como se eu não tivesse feito isso.
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
WLCS22 escreveu:Ahh já sei o que pode ser tbm. Vc tem que colocar o Script em um Objeto na Scene (pode ser um GameObject Empty mesmo), linkar esse Objeto a um atributo do tipo GameObject em "HablitarComponente2" (sugeri "objQueContemOScript") e depois disso eh que vc pega o Componente "GameObjectControler" dentro do Start():
- Código:
public class HablitarComponente2 : MonoBehaviour
{
public GameObject objQueContemOScript;// O Objeto que está na Scene
public GameObjectControler myGameObjectControler;// O outro Script
void Start(){
// É assim que vc vai pegar o outro Script
myGameObjectControler = objQueContemOScript.GetComponent<GameObjectControler>();
}
public void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
// Pra vc saber o nome que está sendo pelo no "other"
print("HablitarComponente2 ::: OnTriggerEnter()");
myGameObjectControler.enabled = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
// Pra vc saber o nome que está sendo pelo no "other"
print("HablitarComponente2 ::: OnTriggerExit()");
myGameObjectControler.enabled = false;
}
}
}
Olha, "(unir ambos os scripts), pois eu não faço a mínima ideia de como fazer isso" eu já te mostrei como fazer . se não for isso, eu já não sei como te ajudar, infelizmente.
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Eu "consegui"... era pela falta disso aqui: (namespace UnityStandardAssets.Characters.FirstPerson) que não estava dando certo. Infelizmente a troca de scripts ficou bugada. Mas obrigado pelas dicas. O importante é aprender.
Re: [RESOLVIDO] Não consigo ativar/desativar um script através de outro
Que bom que conseguiu! Com certeza "O importante é aprender."
WLCS22- MembroAvançado
- PONTOS : 1926
REPUTAÇÃO : 60
Respeito as regras :
Tópicos semelhantes
» COMO DESATIVAR O SCRIPT "FisrtPersonController" DO PLAYER ATRAVÉS DE OUTRO SCRIPT
» [RESOLVIDO] Lista e ativar e desativar funções do script
» [RESOLVIDO] Como acesso essa variável através de outro script??
» [RESOLVIDO] script para ativar e desativar um objeto,animação,etc...
» [RESOLVIDO] DUVIDA SOBRE ATIVAR UM GAMEOBJECT ATRAVÉS DE UMA CONDIÇÃO
» [RESOLVIDO] Lista e ativar e desativar funções do script
» [RESOLVIDO] Como acesso essa variável através de outro script??
» [RESOLVIDO] script para ativar e desativar um objeto,animação,etc...
» [RESOLVIDO] DUVIDA SOBRE ATIVAR UM GAMEOBJECT ATRAVÉS DE UMA CONDIÇÃO
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos