Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Tengo un pequeño lio....

Iniciado por ramunda, Agosto 26, 2016, 05:23:40 PM

Tema anterior - Siguiente tema
Buenas tardes,
 
tengo un pequeño lío.
 
Tengo un Scoremanager donde controlo todas las puntuaciones de los objetos por ejemplo un bumper.
 
Cojo los valores desde alli asi me es mas fácil cambiarlos globalmente.
 
Pero nose que he liado....y ahora no veo la luz, estoy atascado.
 
Este script es el maestro:
 

using UnityEngine;
using System.Collections;
public class ScoreManager : MonoBehaviour
{
public static ScoreManager Instance;
void Awake()
{
Instance = this;
}
public   int score =;
public   int scorebumper =50000;
public   int scoredianas =100;
public   int scoreagujeros =10000;
public   int scoretarjets =100;
public   int scorePower = 1;
public   int bankvalue =10000;
public    TextMesh display;
void Update()
{
   if (display)
   {
      display.text = score.ToString ("D8");
   }
}
public   void ScoreUp(int points)
{
score += (points * scorePower);
}
public  void SetScorePower(int power)
{
   scorePower = power;
}
}
 

 
Bien desde aqui controlo casi todo...
 
Ahora el objeto que me da puntos por ejemplo el bumper.:
 

using UnityEngine;
using System.Collections;
public class Bumper : MonoBehaviour {
public float force = 100.0f;
public float forceRadius = 1.0f;
public int scoreValue= 100;
public GameObject spotlight;
public AudioClip bumpersound;
AudioSource audio;
public  GameObject TextOnSpotGO;
 
 
void Start ()
{
   audio = GetComponent<AudioSource> ();
}

void OnCollisionEnter()
{
   foreach(Collider col in Physics.OverlapSphere(transform.position, forceRadius))
   {
      if (col.GetComponent<Rigidbody> ())
      {  
         spotlight.SetActive (true);
         col.GetComponent<Rigidbody> ().AddExplosionForce (force, transform.position, forceRadius);
         audio.PlayOneShot (bumpersound, 0.7F);
      }
      else
      {
       Invoke ("apagado",01);
      }
   }
   ScoreManager.Instance.ScoreUp(scoreValue);
   Instantiate (TextOnSpotGO, transform.position, Quaternion.identity);
   TextOnSpotGO.GetComponent<TextOnSpotScript>().DisplayText = ScoreManager.Instance.scorebumper * ScoreManager.Instance.scorePower + "";
}
 
void apagado()
{
   
   spotlight.SetActive (false);
}
}

 
lineas 40 a 42.
 
en la 42 le digo que me coja los valores de Scoremanager y los digamos enseñe en un texto flotante en la pantalla.
 
El problema me viene que , en la linea 40:
 
ScoreManager.Instance.ScoreUp(scoreValue);
 
cojo el valor de scorevalue (linea8), para que se me sume al marcador (Scoremanager), pero lo que quiero es cojer el valor de scorebumper no el de scoremanager, y me estoy volviendo loco!!
 
Sera una tonteria pero me tiene saturado.
 
Agradeceria una ayuda por favor.
 
Gracias de antemano.
 
 
 
 
 
 
 
 
 
 

Cuando haces un instantiate tienes que guardar el objeto que instancias en una variable y luego coger el getcomponent de ahi, lo que estas haciendo ahora es intancias el objeto pero no estas accediendo al objeto instanciado,estas accediendo al prefab que tienes referenciado para instanciar,por ultimo para acceder al valor del score del bumper es scoreValue directamente. quedaria asi
 

GameObject textInstance = Instantiate (TextOnSpotGO, transform.position, Quaternion.identity) as GameObject;
textInstance.GetComponent<TextOnSpotScript>().DisplayText = scoreValue * ScoreManager.Instance.scorePower + "";

 
el TextOnSpotGO solo es un prefab que tienes referenciado para poder instanciarlo cuando quieras, pero el prefab ni siquiera esta en la escena hasta que instancies una copia.Si cambias algo del TextOnSpotGO luego todas las instancias que hagas saldran con esos cambios,cuando tu lo que quieres es instanciar y entonces cambiar esos valores.Digamos que el TextIOnSpotGO solo es una base de la que vas a ir creando y destruyendo copias configuradas a tu gusto en la escena
 
No se si me habre explicado guay xD xD

Agosto 26, 2016, 10:56:47 PM #2 Ultima modificación: Agosto 26, 2016, 11:41:26 PM por ramunda
Muchas gracias hammer , te has explicado de lujo, como antaño Xd.
 
Pero el que no se explica soy yo.
 
Esto me funcionaba mas o menos bien , ahorra mejor jejje.
 
Pero realmente lo que pedía era no tener que coger el valor de scorevalue sino el de el Gamemanager , veras que cree ints para todo , bumperscore, agujeroscore etc...
 
Quiero añadir a la puntuación el valor de el int de scoremanager + el multiplicador que tenga el scoreup osea x1 , x2 etc.
 
ahora lo esta cojiendo como tu bien me has dicho desde scorevalue.
 
lo quiero coger desde aqui:
 

public   int scorebumper =50000;
public   int scoredianas =100;
public   int scoreagujeros =10000;
public   int scoretarjets =100;
public   int scorePower = 1;
public   int bankvalue =10000;

 
no de aquí:
 

ScoreManager.Instance.ScoreUp(scoreValue);

 
ni de Text On Spot
 
i eso es lo que no puedo conseguir :)
 
Porque lo que he entendido es que, asi el TexTonspot es solo un portador esporadico que mostrara el valor que tenga el Scorevalue?
 
Bien , pero es que me esta cogiendo el valor de El TextOnspot no el de el scorevalue :)
 
Vale ya esta , bien lo pome mi nick soy nooobbbbbbb con B alta, era tan facil como quitarle el valor al TextOnSpot....ponerlo a 0.
 
Mil gracias hammer, eres un genio!!!
 
P.D todo esos ints se puede borrar no sirven para nada XD.
 
Saludos.
 
 
 
 
 
 
 
 
 
 
 
 

Agosto 27, 2016, 12:09:06 AM #3 Ultima modificación: Agosto 27, 2016, 12:09:37 AM por hammer
A ver me estoy liando, la gracia era que cada bumper o lo que fuera, tuviera su propia puntuacion asi pasarle la puntuacion a una funcion del  managerScore,donde este la sumaba a la puntuacion global teniendo encuenta el potenciador.
 
Es decir tu tienes el managerScore  o ScoreManager , como se llame xD xD, que es el que controla la puntuacion de la partida,no de cada objeto,tiene la variable de la puntuacion de la partida,el estado de los potenciometros y las funciones que van a modificar la puntuacion de la partida.Luego cada Bumper,por ejemplo o agujero dianas trampas lo que sea, tiene su script donde esta el scoreValue,en esta variable asignamos la puntuacion que queremos dar con ese bumper,asi a cada bumper le podemos dar su propia puntuacion.Entonces lo que hacemos es que cuando se produce una colision,o pasa por un trigger, llamamos a la funcion ScoreManager.ScoreUp(); que se encarga de sumar la puntuacion que le hayamos pasado en este caso pues pasamos la puntuacion que tiene asignada el bumper donde se ha producido la colision. ScoreManager.ScoreUp(scoreValue);
 
Despues tenemos el tema de los potencimetros,para eso tenemos el scorePower,me parece recordar que asi lo tenias, el scorePower es el potencidaor, si esta a por 1 se sumara la puntuacion por defecto por 2 el doble,etc etc,.Pero tu no te tienes que preocupar por eso por que el ScoreManager.ScoreUp() ya se encarga de multiplicar el valor que quieras sumar por el estado del scorePower, lo unico que tienes que hacer es cuando quieras, llamar a la funcion que tenias ScoreManager.SetScorePower(); para activar el potenciador, cuando quieras que este a por 2 pues ScoreManager.SetScorePower(2); y para volver a la normalidad cuando se acabe el potenciador pues vuelves a llamar a la funcion poniendola a uno ScoreManager.SetScorePower(1);,
 
Asi  que simplemente con ScoreManager.ScoreUp("la puntuacion a sumar") y con ScoreManager.SetScorePower("el estado del potencimetro") ya lo tienes todo, una funcion para sumar puntos,donde le pasas los puntos a sumar y la funciona ya tiene en cuenta el estado del potencimetro y la otra para cambiar el estado del potencimetro.
 
 
 
De todas maneras si lo que quieres es acceder a una variable del manager pues es como aceder a cualquier otra variable, ya lo tenias bien con ScoreManager.scoreBumper * ScoreManager.scorePower, lo que tu lo estabas asignando al 
 

TextOnSpotGO.GetComponent<TextOnSpotScript>().DisplayText

 
 
 
Recuerda que el TextOnSpotGO solo es una referencia al prefab que tienes creado,pero que no esta en escena, asi que no lo veras,si despues hicieras un
 

Debug.Log(TextOnSpotGO.GetComponent<TextOnSpotScript>().DisplayText);

 
entonces como veras como te ha cambiado ese valor en el prefab que tienes referenciado,lo tienes guardado en memoria para poder crear copias en la escena cuando quieras
 
Pero como te digo te estas liando mucho,hecha un poquete el freno y intenta reordenar todo,formas de hacerlo hay mil diferentes pero me da que las  estas mezclando

Estoy de acuerdo al 100% de todo lo que has dicho de echo es lo que estoy haciendo, con tu solución anterior es exactamente como has dicho cada trasto tiene su puntuación y la mandamos tanto al score como al Texto flotante, lo estoy ordenado todo y puliendo puntuaciones hahahha, y si lo del x2 y x3 eso esta suoper resuelto(fuistes tu XDDd).
 
Todo anda bien Hammer, mil gracias por tu tiempo, por la paciencia , y por las explicaciones que son mas que extensas y comprensibles
 
Cuando tenga algo....decente echo lo posteare para que lo veais :).
 
Muchas gracias de nuevo , si me saturo...ya posteare :)
 
 
 
Salut y gracias.
 
 
 
 

Etiquetas: