Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Ivan

Me falla este script y no sé por qué

Recommended Posts

Hace solo unos dias que empece en el desarroyo de videojuegos porque siempre me gusto, pero estoy empezando a aprender algo de scripts C#, y los que hice viendo tutoriales, me fueron bastante bien, hasta que intente hacer un controlador para el personaje, que me tira errores y no entiendo muy bien porque.

El codigo es este:

using System.Collections;
using UnityEngine;

public class Controller : MonoBehaviour
{
	public float m_Velocidad = 8F;
	public float m_VelocidadDeRotacion = 80F;
	public bool EnPiso=true;

    void Update() {
		float translation = Input.GetAxis("Vertical")*m_ Velocidad;
		float rotation = Input.GetAxis("Horizontal")* m_VelocidadDeRotacion; 
		translation *= Time.deltaTime;
		rotation *= Time.deltaTime;
		transform.Translate(0,0,translation);
		transform.Rotate(0,rotation,0);

		RaycastHit m_Golpe;
		Vector3 physicsCentre = this.transform.position + this.GetComponent <CapsuleCollider>().center;
		Debug.DrawRay (physicsCentre,Vector3.down*1,2f,Color.green,1);
		if (Physics.Raycast (physicsCentre, Vector3.down, out m_Golpe, 1,2f))
		{
			if (m.Golpe.transform.gameObject.tag != "Player")
			{
				EnPiso = true;
			}
		} else
	    {
			EnPiso = false;
		}
		{
		Debug.Log (EnPiso);

		if(Input.GetKeyDown(KeyCode.Space)&&EnPiso)
		{ this.GetComponent<Rigidbody>().AddForce(Vector3.up*200); }

		}}}
	

Si alguien sabe lo que me puede fallar agradeceria que me ayudaseis, perdonad por mi ignorancia pero llevo solo unos dias haciendo esto.

Edited by pioj
mensaje editado por el Admin, para cumplir las Normas.

Share this post


Link to post
Share on other sites

Hay varios problemas, quizá el más grave es que tratas de aplicar un comando directamente a un componente, si sacar antes el componente mediante una variable.. Te estará dando null reference exception y cosas así..

 

Share this post


Link to post
Share on other sites
On 5/9/2019 at 12:55 PM, Ivan said:

Si alguien sabe lo que me puede fallar agradeceria que me ayudaseis

Postea todos los errores, fijate en la consola, si se repiten varias veces usá la opcion "Collapse", aunque seguramente sea lo que dice pioj con las NullReference.

1) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

On 5/9/2019 at 12:55 PM, Ivan said:

GetComponent <CapsuleCollider>()

Si no encuentra el Collider te da NullReference, además hacer esto es horrible para el mundo del update, aplicá algo así:

CapsuleCollider capsuleCollider;

void Awake()
{
	capsuleCollider = GetComponent <CapsuleCollider>();
}
      
void Update()
{
      //no es necesario usar "this", salvo que tengas otra variable local con el mismo nombre "transform", hacelo como quieras
      Vector3 physicsCentre = transform.position + capsuleCollider.center;
      ...
}
      

 

2) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Para los tags comparalos directamente por el valor, no recuerdo si el operador == lo hace, por las dudas siempre use CompareTag o si fuera una strings podés usar string.Equals( srtA , strB );

if( !m.Golpe.transform.gameObject.CompareTag( "Player" ) ) //Se mete si el tag no es "Player"

 

3) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Lo mismo que en 1)


Rigidbody rb;

void Awake()
{
	rb = GetComponent<Rigidbody>();
}
      
void Update()
{
      
  		if(rb != null)	//podrías o no hacerlo, con esto te evitás de hacer el AddForce si rb es null
      		rb.AddForce(Vector3.up*200);
      ...
}
   

 

Share this post


Link to post
Share on other sites

Si tu único problema es que te pega tirones prueba a poner FixedUpdate() en vez de Update,  así debería ir considerablemente más fluído

Share this post


Link to post
Share on other sites
11 hours ago, romadritex said:

Si tu único problema es que te pega tirones prueba a poner FixedUpdate() en vez de Update,  así debería ir considerablemente más fluído

no creo que en este caso en particular le resulte considerablemente más fluido ya que tiene un GetKeyDown y FixedUpdate para los "Get___Down" es bastante fiero a la hora de "detectar" las inputs directamente (a no ser de ir acumulando los flags como debe de ser), pero es cierto en una cosa, cualquier cosa relacionada con físicas de rigidbodies dinámicos debe ir en FixedUpdate.

Algo así sería lo indicado:

Rigidbody rb;

bool inputFlag = false;


void Awake()
{
	rb = GetComponent<Rigidbody>();
}
      
void Update()
{
      inputFlag |= Input.GetKeyDown(...) ;
  	...
}
      
void FixedUpdate()
{
      if(inputFlag)	//podrías o no hacerlo, con esto te evitás de hacer el AddForce si rb es null
      		rb.AddForce(Vector3.up*200);
      
      inputFlag = false;
      
      ...
}      

 

Share this post


Link to post
Share on other sites

No se si el código es exactamente el mismo que tienes puesto en la aplicación, pero si es así tienes una variable que estas accediendo a ella de forma errónea:

Quote

RaycastHit m_Golpe;
        ...
            if (m.Golpe.transform.gameObject.tag != "Player")
            {
                EnPiso = true;
            }
          }

 

Cambia el punto por la barra baja y prueba. 

Aun así como te han dicho es de mucha ayuda que pongas la salida de la consola para poder ver los errores.

 

Saludos

Share this post


Link to post
Share on other sites

×
×
  • Create New...