Jump to content
UnitySpain

Biarox1166

Registrados
  • Content Count

    54
  • Joined

  • Last visited

Community Reputation

2 Neutral

About Biarox1166

  • Rank
    Usuario

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

540 profile views
  1. Gracias @Igor y @OnlyDavies lo pude solucionar y fue una boludes jajajaja perdón por la pregunta tan tonta. Yo utilizaba una esfera 3D a la cual le modificaba el valor de la escala en base al radio y no al diámetro! Asi que ahora ya funciona bien jajaja gracias de nuevo : p
  2. Hola a todos, se que el título no es muy descriptivo pero no sabría como expresarlo en poquitas palabras xD. Veran lo que estoy buscando hacer es algo que he de suponer es simple pero le estuve dando muchas vueltas y no lo consigo. Tengo un personaje el cual al seleccionar una parte del mapa cae allí e inflige un daño de área determinado, lo que quiero hacer es que previo a clikear en la zona, se muestre un "circulo" que represente el área de daño del personaje. Esta área es un simple sphere collider el cual modifica su radio via script, lo que no consigo es la forma de pasar este radio a un objeto o imagen(probé con objetos 3d y de UI) el cual pueda ajustarse en base a ese parámetro. Por eso quería pedirles si alguien me puede tirar una idea o algo con lo que me pueda basar porque no lo consigo, de antemano gracias : )
  3. @jeico008 Tenías razón jajaja no se porque no lo había probado antes, pero si funciona. Gracias!!!
  4. Te referís a usarlo en esta línea? Sabes que no lo probé? Ahora voy a ver si me funciona así xD
  5. Hola a todos, les vengo a pedir un poco de ayuda ya que tengo una script que funciona conjuntamente con otra script que instancia objetos, la primera se encarga del drag and drop, la cosa es uqe funciona perfecto pero está hecha para inputs de PC y yo necesito que se pueda hacer desde un celular. Estuve viendo en el manual de Unity y en internet en general cómo modificar esta script pero no puedo hacerlo, intenté detectar si la touchCount es mayor a cero, almacenar la posicion del primer touch, luego calcular los delta entre este y el objeto instanciado pero no me funciona. Despues lo traté de implementar con los TouchPhase pero no lo logro hacer funcar. Alguno me puede ayudar con el código o bien mostrarme un video que explique algo por el estilo en entornos 3D? De antemano gracias : ) private void Update() { if (objetoActual != null) { MoverObjetoAlMouse(); RotacionPorScroll(); SoltarObjeto(); } } public void SetInstanceID(int id) { objetoActual = Instantiate(Prefabs[0]); objetoActual.GetComponentInChildren<Torre>().ID = id; renders.Clear(); colores.Clear(); materiales.Clear(); SeteoDeColorOriginal(); } private bool BotonDelMismoPrefab(int i) { return objetoActual != null && objetoActualIndex == i; } private void MoverObjetoAlMouse() { if (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Moved) { Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);//Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, Mathf.Infinity, ZonaPosible)) { objetoActual.transform.position = hit.point; objetoActual.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); if (hit.normal == Vector3.up) { if (!objetoActual.GetComponent<ObjetoPosicionado>().Bloqueado) { print("desbloqueado"); AsignacionDeColores(false, false); PoderSoltar = true; } else { print("bloqueado por colision"); AsignacionDeColores(true, false); PoderSoltar = false; } } else { print("bloqueado por no ser vertical"); AsignacionDeColores(true, false); PoderSoltar = false; } } else { if (Physics.Raycast(ray, out hit)) { print("bloqueado por no coincidir el layer"); objetoActual.transform.position = hit.point; objetoActual.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal); AsignacionDeColores(true, false); PoderSoltar = false; } } } } private void RotacionPorScroll() { if (Input.touchCount > 1) { rotacionMouseScroll += Input.mouseScrollDelta.y; //Aca no se bien cómo reemplazarlo objetoActual.transform.Rotate(Vector3.up, rotacionMouseScroll * velocidadDeRotacion); } } private void SoltarObjeto() { if (Input.GetButtonDown("Fire1") && PoderSoltar) { AsignacionDeColores(false, true); Destroy(objetoActual.GetComponent<ObjetoPosicionado>().Newbc); objetoActual.GetComponent<ObjetoPosicionado>().TorreScript.enabled = true; objetoActual.GetComponent<ObjetoPosicionado>().Ani.enabled = true; foreach (Collider coll in objetoActual.GetComponent<ObjetoPosicionado>().Colls) { coll.enabled = true; } if(objetoActual.layer == 2) { objetoActual.layer = objetoActual.GetComponent<ObjetoPosicionado>().layersOriginales[0]; } for (int i = 0; i < objetoActual.transform.childCount; i++) { if(objetoActual.transform.GetChild(i).transform.gameObject.layer == 2) { objetoActual.transform.GetChild(i).transform.gameObject.layer = objetoActual.GetComponent<ObjetoPosicionado>().layersOriginales[i]; } } objetoActual = null; rotacionMouseScroll = 0; if (usarAudio) { if (!GetComponent<AudioSource>().isPlaying) { GetComponent<AudioSource>().PlayOneShot(DespligueSonido); } } } else { if (usarAudio) { if (Input.GetButtonDown("Fire1") && !PoderSoltar) { if (!GetComponent<AudioSource>().isPlaying) { GetComponent<AudioSource>().PlayOneShot(BlockSound); } } } } } }
  6. Hola a todos! Les cuento que mi problema es el siguiente: tengo un scriptableobject a modo de base de datos en la que entre las distintas variables que tiene para cada objeto dentro de la base de datos, una es del tipo GameObject y almacena un prefab el cual se conforma siempre de un particle system y en algunos casos tienen hijos con otros particle system. La cuestión es que lo que quiero es que dependiendo de que ID tenga el jugador en cualquier momento(esta cambia dependiendo del botón que se aprete) sea visible o uno u otro prefab. La primera opción que se me ocurrió es la de volver hijo del jugador todos estos prefabs y luego desactivarlos y activarlos dependiendo de la ID, pero quiero saber si quizás se puede hacer de una forma más simple en la que no tenga que adherir constantemente un prefab como hijo del player y que solo con agregarlo a la base de datos ya lo pueda utilizar. De acá solo se me ocurre que por ahí si dejo un gameobject como hijo del player quizás via script con el addcomponent pudiese modificarle sus componentes para "igualarlo" al prefab de la base de datos correspondiente a su ID, si bien puedo adicionarle los componentes necesarios no pude copiar los valores del prefab. Si alguien sabe cómo hacerlo o se le ocurre una mejor idea estaría muy agradecido.
  7. @lightbug por lo que decis del rect tenes razón la local pos del rect de la zona "draggeable" es 0,0,0 pero por el hecho del emparentamiento solo funciona en una esquina inferior. Y lo del OnMOve no funciona porque si no me equivoco es para eventos touch. Si se e ocurre otra forma(quizás como dices sin emparentar) porfa decimela y gracias por responder tan rápido : )
  8. hola @lightbug ! gracias por responder mira traté de usar el rect.contains(el cual me viene de maravilla para lo que quiero) el tema es que no se si lo implementé bien ya que no sucede nada y creé una variable bool la cual nunca cambia. Te dejo la script a ver si me puedes ayudar : p public class Arrastrar_Inventario : MonoBehaviour, IDragHandler, IBeginDragHandler, IDropHandler , IPointerClickHandler { private Vector2 offset; public Vector2 posInicial; private bool drag; void Start() { posInicial = transform.GetChild(0).transform.position; } public void OnPointerClick (PointerEventData eventData) { RectTransform r = transform.GetComponent<RectTransform>(); if (r.rect.Contains(eventData.pressPosition)) { drag = true; } else { drag = false; } } public void OnBeginDrag(PointerEventData eventData) { offset = eventData.position - new Vector2(this.transform.position.x, this.transform.position.y); this.transform.position = eventData.position - offset; } public void OnDrag(PointerEventData eventData) { if(drag) this.transform.position = eventData.position - offset; } public void OnDrop (PointerEventData eventData) { drag = false; } }
  9. Gracias a ambos por la yuda pero tengo otra pregunta : p ¿Cómo podría hacer para que solo arrastre al objeto si clickeo en determinado espacio de este? Osea, por ejemplo solo voy a poder moverlo si hago click y arrastro desde la parte superior del objeto.
  10. Hola! Nuevamente traigo una duda esta vez una simple, creo yo. Verán tengo una imagen la cual simplemente quiero ser capaz de arrastrarla con el mouse, y si bien lo logré con OnDrag el problema es que se mueve desde lo que sería el centro de la imagen haciendo que cuando yo le de un click la imagen se "mueva" hasta que su centro coincida con la posición del mouse y recién ahí comienza el drag propiamente dicho(si bien se que yo mismo le digo que haga eso, no esncuentro la forma de hacer que se mueva desde la parte de la imagen que yo haya clickeado). Les dejo la script que tengo: public class Arrastrar_Inventario : MonoBehaviour, IDragHandler { public void OnDrag (PointerEventData eventData) { transform.position = eventData.position; } } Creo que la solución sea usar el eventData.pressPosition para obtener la posición del click y de ahí ejecutar el drag pero no encontré la forma de hacerlo. Gracias de antemano : )
  11. Muchisimas gracias a todos en especial a @francoe1 y @UnityDevelopersXD por la ayuda ya puse el código de francoe el tema está en que me tira error en el condicional de "item == null" ya que no lo toma y si lo convierto en bool pierde "efecto" me podrían ayudar con eso ultimo please? : p
  12. Buenisimo!! @UnityDevelopersXD El tema es que traté de implementar este codigo y me marca como error toda la parte del delegate(Cannot implicitly convert type `void' to `InventarioNuevo.ObjetoInvId') y en el condicional "!EncontroParecido" tambien hay un error ya que si no creo un for la variable i nunca es creada. Si me puedieses ayudar con eso ya no jodo más jajaja
  13. Gracias a todos!!! Aunque debo decir que lo solucioné de esta manera: public void AgrregarItem (int id, int cantidad){ for (int i = ; i < inventarioo.Count; i++){ if (inventarioo[i].id == id) { inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad); ActualizarInventario(); return; } } inventarioo.Add(new ObjetoInvId(id, cantidad)); ActualizarInventario(); } Osea uso el return en caso de encontrar misma id, sino no sucede, salgo del for y agrego el item. Aunque que voy a usar el metodo del if y else ya que supongo que el uso de los return no esta correctamente aplicado(si me pudieran explicar lo agradecería ya que al parecer funciona : p) y para lo de implementar de la manera que dice @francoe1 con LINQ debo usar una librería especial o solo con crear el array y usarlo de la manera que mostras acá ya está? Disculpen si hago preguntas muy básicas pero quiero entender : p
  14. Hola a todos! Les cuento que estoy teniendo un problema con una script de inventario que estoy utilizando de este video: Para que no tengan que ver todo el video les voy a indicar las partes puntuales. Verán mi problema es que en la función "AgregarAlgoAlInventario"(38:05) si bien se crea un "item" y si agrego otro de igual id se suman sus cantidades, solo pasa con el primer objeto de la lista(la lista de ObjetoInvId) ya que si agrego otro item con distinto id se crea un nuevo "slot",osea se adiciona un nuevo objeto en la lista(hasta ahí todo bien), pero al agregar otro item igual(mismo id que el segundo item) al segundo item se le suma la cantidad correcta, pero además se me crea otro slot y así sucesivamente. Ya que quizas lo explique medio para el tuje les dejo un gif: El element 0 es el priemer item al cual al seguir agregandolo aumenta su cantidad y no se duplica. Ya los otros elementos como pueden ver tienen el mismi id pero se agregan en slots separados(aunque un detalle es que el Element 1 va aumentando su canidad en base a los nuevos duplicados de este) Bueno ese es en sí el error les dejo toda la script por si las dudas, aunquecreo que el error debe estar en la función que nombre arriba(pareciera que no respeta el return : p): using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; public class Inventario : MonoBehaviour { [System.Serializable] public struct ObjetoInvId { public int id; public int cantidad; public ObjetoInvId(int id, int cantidad) { this.id = id; this.cantidad = cantidad; } } [SerializeField] Database data; [Header("Variables del Drag and Drop")] public GraphicRaycaster graphRay; private PointerEventData pointerData; private List<RaycastResult> raycastResults; public Transform canvas; public GameObject objetoSeleccionado; public Transform ExParent; [Header("Prefs y items")] public Transform Contenido; public Item item; public List<ObjetoInvId> inventarioo = new List<ObjetoInvId>(); void Start () { ActualizarInventario(); pointerData = new PointerEventData(null); raycastResults = new List<RaycastResult>(); } void Update () { Arrastrar(); if (Input.GetKeyDown(KeyCode.F)) { AgrregarItem(1, 1); } if (Input.GetKeyDown(KeyCode.G)) { AgrregarItem(3, 1); } } void Arrastrar () { if (Input.GetMouseButtonDown()) { pointerData.position = Input.mousePosition; graphRay.Raycast(pointerData, raycastResults); if (raycastResults.Count > ) { if (raycastResults[].gameObject.GetComponent<Item>()) { objetoSeleccionado = raycastResults[].gameObject; ExParent = objetoSeleccionado.transform.parent; ExParent.GetComponent<Image>().fillCenter = false; objetoSeleccionado.transform.SetParent(canvas); } } } if(objetoSeleccionado != null){ objetoSeleccionado.GetComponent<RectTransform>().localPosition = CanvasScreen(Input.mousePosition); } if(objetoSeleccionado != null) { if(Input.GetMouseButtonUp()){ pointerData.position = Input.mousePosition; raycastResults.Clear(); graphRay.Raycast(pointerData, raycastResults); objetoSeleccionado.transform.SetParent(ExParent); if(raycastResults.Count > ){ foreach(var resultado in raycastResults){ if(resultado.gameObject == objetoSeleccionado) continue; if(resultado.gameObject.CompareTag("Slot")){ if(resultado.gameObject.GetComponentInChildren<Item>() == null){ objetoSeleccionado.transform.SetParent(resultado.gameObject.transform); Debug.Log("Slot libre"); } } if(resultado.gameObject.CompareTag("Item")){ if(resultado.gameObject.GetComponentInChildren<Item>().ID == objetoSeleccionado.GetComponent<Item>().ID){ Debug.Log("Tienen el mismo ID"); resultado.gameObject.GetComponentInChildren<Item>().cantidad += objetoSeleccionado.GetComponent<Item>().cantidad; Destroy(objetoSeleccionado.gameObject); }else{ Debug.Log("Distinto ID"); objetoSeleccionado.transform.SetParent(resultado.gameObject.transform.parent); resultado.gameObject.transform.SetParent(ExParent); resultado.gameObject.transform.localPosition = Vector3.zero; } } } } objetoSeleccionado.transform.localPosition = Vector3.zero; objetoSeleccionado = null; } } raycastResults.Clear(); } public Vector2 CanvasScreen(Vector2 screenPos){ Vector2 viewportPoint = Camera.main.ScreenToViewportPoint(screenPos); Vector2 canvasSize = canvas.GetComponent<RectTransform>().sizeDelta; return(new Vector2(viewportPoint.x * canvasSize.x, viewportPoint.y * canvasSize.y) - (canvasSize/2)); } public void AgrregarItem (int id, int cantidad){ for (int i = ; i < inventarioo.Count; i++){ if (inventarioo[i].id == id) { inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad + cantidad); ActualizarInventario(); return; } inventarioo.Add(new ObjetoInvId(id, cantidad)); ActualizarInventario(); } } public void EliminarItem(int id, int cantidad) { for (int i = ; i < inventarioo.Count; i++) { if (inventarioo[i].id == id) { inventarioo[i] = new ObjetoInvId(inventarioo[i].id, inventarioo[i].cantidad - cantidad); if (inventarioo[i].cantidad <= ) { inventarioo.Remove(inventarioo[i]); ActualizarInventario(); return; } } Debug.LogError("No hay nada que eliminar!"); } } List<Item> pool = new List<Item>(); public void ActualizarInventario () { print("Inventario Actualizado"); for (int i = ; i < pool.Count; i++) { if(i < inventarioo.Count) { ObjetoInvId o = inventarioo[i]; pool[i].ID = o.id; //Aqui le asigno la id del objeto a mi script llamada Item pool[i].GetComponent<Image>().sprite = data.baseDatos[o.id].icono; pool[i].GetComponent<RectTransform>().localPosition = Vector3.zero; //Esto lo hagoya que al utilizar slots y meter alli los items se me produce un error en la posicion pool[i].cantidad = o.cantidad; pool[i].gameObject.SetActive(true); } else { pool[i].gameObject.SetActive(false); } } if(inventarioo.Count > pool.Count) { for (int i = pool.Count; i < inventarioo.Count; i++) { Item it = Instantiate(item, Contenido.GetChild(i)); //Aqui el getchild(i) lo utilizo para crear el itemdentro del slot pool.Add(it); it.transform.position = Vector3.zero; it.transform.localScale = Vector3.one; ObjetoInvId o = inventarioo[i]; pool[i].ID = o.id; //Aqui le asigno la id del objeto a mi script llamada Item pool[i].GetComponent<RectTransform>().localPosition = Vector3.zero;//Esto es por lo mismo que aclare arriba pool[i].GetComponent<Image>().sprite = data.baseDatos[o.id].icono; pool[i].cantidad = o.cantidad; pool[i].gameObject.SetActive(true); } } } } En donde hice anotaciones es debido a que el sistema de drag and drop lo saque de otro canal y tuve que adecuarlo. Gracias de antemano : )
  15. Hola @sam mira no soy muy experto en lo que respecta programación : p pero voy a tratar de ayudarte... -Para lo primero es fácil, una forma, por ejemplo es crear una variable que almacene al gameObject al que le queres modificar algún componente, y luego en esa script llamas a esa variable(supongamos Player) y con GetComponent<>() seleccionas el componente y lo modificas. Ej(quiero mover a un cubo desde una script que tiene mi jugador): public GameObject cubo; public float velo = 5f; void Update () { if(Input.GetKey(KeyCode.W)){ cubo.GetComponent<Transform>().Translate(Vector3.forward*Time.deltaTime*velo); } } y con el getcomponent podes modificar los valores de los componentes de(en este ejemplo) el cubo. -De poder se puede y se suele hacer, lo que conozco como "GameManager", ahora para lo que te referís no se si sea conveniente, los manager(según mi entender, puedo equivocarme) te sirve para almacenar valores que quieres "mantener" durante el transcurso del juego(puntaje por ej) y que no se pierda al cambiar entre escenas(usando DontDestroyOnLoad) y para cosas como el audio creo que también. -Y para lo de una variable global se me ocurren dos formas: La primera y creo que para lo que la necesitas es la mejor, volviendo la variable stática: using System.Collections; using System.Collections.Generic; using UnityEngine; public class blabla : MonoBehaviour { public static bool Pause; ///... y en las scripts que la necesites llamala así: blabla.Pause = true/false; Y la segunda forma es la de crear una variable que almacene la script en la que se encuentra la variable que queres que sea "global": using System.Collections; using System.Collections.Generic; using UnityEngine; public class NewBehaviourScript : MonoBehaviour { public NombreDeLaScipt myScript; void Update() { myScript.variableGlobal = ...... } } Espero poder haberte ayudado : )
×
×
  • Create New...