Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - ramunda

#1
General (Antiguo) / Moverse al enemigo
Diciembre 20, 2018, 10:54:34 PM
Muchas gracias por la explicación /respuesta #lightbug, desgracidamanete no me ha funcionado o no he sabido aplicar el ejemplo que me has propuesto.
 
Y si, la idea era que detectara el enemigo mas cercano habiendo varios pululando cerca.
 
De todas maneras mil gracias , ya vere como lo apaño...
 
Feliz Navidad amigo.
#2
General (Antiguo) / Moverse al enemigo
Diciembre 20, 2018, 06:15:33 PM
Buenas tardes a todos/todas, es una tonteria pero me he liado.
 
estoy haciendo que dos pequeños ejercitos se peguen de leches unos con otros y para eso he creado (creo) la manera que detecte al enemigo mas cercano.
 
Hasta aqui va ok, me dice la distancia y detecta al tag requerido, pero me he atascado a la hora de decirle que si la distancia es +o- la esti***da el agresor vaya hacia ese objetivo.
 
Moverse se mueve pero no se para al llegar al ojectivo! el sigue palante .
 
 
 

public class Enemy : MonoBehaviour
{
    public float curDist = 20;
    GameObject[] enemigos;
    GameObject enemigo;
    public GameObject player;
    public float MoveSpeed = 3f;
    void Update()
    {
       
            enemigos = GameObject.FindGameObjectsWithTag("enemy1");
            curDist = 1;
            foreach (GameObject item in enemigos)
            {
                float dist = Vector3.Distance(player.transform.position, item.transform.position);
                if (dist >= curDist) ;
                {
                    curDist = dist;
                    enemigo = item;
                    print(dist);
                    player.transform.position += transform.forward * MoveSpeed * Time.deltaTime;
                }
            }
           
    }
}

 
seguro que es un tonteria pero me he bloqueado!, agradezco una mano , gracias de antemano y Feliz Navidad!
 
 
#3
General (Antiguo) / Problema on trasform enemigo(Resuelto)
Septiembre 22, 2018, 03:40:03 PM
@debug
Cita de: ramunda date=1537623603@debug
   


mil gracias a los 3 , ya salio algo entre todas las posibles opciones!!! soys geniales! mil gracias por la ayuda y por el tiempo prestado!!!
 
Un abrazo!!
 
 
 
 
#4
General (Antiguo) / Problema on trasform enemigo(Resuelto)
Septiembre 21, 2018, 10:22:38 PM
Gracias   @lightbug
 
Desgraciadamente sigue sin funcionar, pero despues de vuestra ayuda intentare enfocarlo de otra manera.
 
Muchas gracias
 
 
#5
General (Antiguo) / Problema on trasform enemigo(Resuelto)
Septiembre 21, 2018, 04:20:50 PM
Gracias juanmma_teso, lo que me dices tiene mucho sentido, pero el problema es que en la coorutina no puedo saber cuento tiempo el enemigo estara en la distancia de <3 en frente de el player, se puede tirar un mimuto como 3 segundos, si estipulo en tiempo se parara.
 
igualmente lo he provado...y algo he echo mal porque no funciona , se activa la sangre al empezar el juego luego se va y el enemigo al pegarme no se activa :(
 
 
 
:(
 
la parte de el enemigo simplemente la he dejado asi:
 

if (distance <= 3)
        {
                GetComponent<Animation>().CrossFade("2H_skeleton_specal_attack_A");
                ManagerScript.manager.Vida -= 5f * Time.deltaTime;
                ManagerScript.manager.activasangre = true;
                pega.enabled = true;
                espadahit.enabled = true;
          }

 
y el manager asi con la coorutina que me sijeristes:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using UnityEngine.UI;
public class ManagerScript : MonoBehaviour
{
    public static ManagerScript manager;
    public float Vida;
    public float Mana;
    public float Manamaximo = 100f;
    public float manaReg;
    public GameObject player;
    public GameObject sangre;
    public bool activasangre;
    private float tiempoDeEspera = 5f;
    public float experiencia = 0f;
    public Text exptext;
    //public bool activamusicabatalla;
    //public AudioSource batalla;
    public GameObject playermuerto;
 
    void Awake()
    {
        if (manager == null)
        {
            DontDestroyOnLoad(gameObject);
            manager = this;
        }
        else if (manager != this)
        {
            Destroy(gameObject);
        }
    }
    void Start()
    {
        activasangre =false;
    }
 
    void Update()
    {
        exptext.text = "Experiencia: " + experiencia.ToString();
        if (activasangre = true)
        {  
            StartCoroutine("CorrutinaSangre");
        }
        else if (activasangre = false)
        {
            sangre.SetActive(false);
        }
               
            if (Mana <= Manamaximo)
        {
            StartCoroutine(RegainHealthOverTime());
           
        }
        if (Vida <= 0)
        {
            player.SetActive(false);
            playermuerto.SetActive(true);
        }
    }
    IEnumerator RegainHealthOverTime()
    {
        while (Mana < Manamaximo)
        {
            manaregen();
            yield return new WaitForSeconds(5);
        }
    }
    public void manaregen()
    {
        Mana += manaReg*Time.deltaTime;
    }
    private IEnumerator CorrutinaSangre()
    {
        sangre.SetActive(true);
        yield return new WaitForSeconds(tiempoDeEspera);
        sangre.SetActive(false);
    }
}

 
pero la he liado y nada va a cordes.
 
 
#6
General (Antiguo) / Problema on trasform enemigo(Resuelto)
Septiembre 21, 2018, 02:57:03 PM
Buenas tardes, llevo dos dias rompiendome la cabeza de este problema, veran;
 
Tengo un enemigo que me persigue a distgancia x me ataca a distancia x...eso va perfecto, a la hora de activar un simple canvas que es una imagen de sangre en la pantalla solo lo activa el primer enemigo los demas pasan de activar nada.
 
Creo que el problema puede ser en el transform(ahora lo vereis en el script), lo mismo me pasa al activar audios etc solo uno lo hace los demas aunque aga prefab no funciona.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
 
public class enemigoataca2 : MonoBehaviour
{
    public Transform player;
    public float velocidadenemigo;  
    public float distance;
    public AudioSource pega;
    public AudioSource camina;
    public AudioSource espadahit;
   
 
    void Start()
    {
        player = GameObject.FindGameObjectWithTag("player").transform;
        pega.enabled = false;
        camina.enabled = false;
        espadahit.enabled = false;
       
 
    }
    void Update()
    {
        distance = Vector3.Distance(transform.position, player.position);
        if (distance <= 30)
        {
            camina.enabled = true;
            pega.enabled = false;
            GetComponent<Animation>().CrossFade("Walk");
            GetComponent<walkmesh2>().enabled = false;
            GetComponent<UnityEngine.AI.NavMeshAgent>().SetDestination(player.transform.position);
           
        }
        if (distance <= 3)///AQUI DEBERIA ACTIVAR EL CANVAS SANGRE/AUDIO LO QUE SEA
        {
           GetComponent<Animation>().CrossFade("2H_skeleton_specal_attack_A");
            ManagerScript.manager.Vida -= 5f * Time.deltaTime;
            ManagerScript.manager.activasangre = true;
            pega.enabled = true;
            // player.GetComponent<Animation>().Play("Cover_sword_hit");
            espadahit.enabled = true;
        }
        else
        {
           
            espadahit.enabled = false;
            // player.GetComponent<Animation>().CrossFade("Run");
            ManagerScript.manager.activasangre = false;
        }
       
     
        if (distance >= 25)
        {
            camina.enabled = false;
            GetComponent<walkmesh2>().enabled = true;
        }
    }
}

 
Donde le digo que si la distancia es-= 3 es donde deberia activarlo.
 
y creo que el problema viene de : player = GameObject.FindGameObjectWithTag("player").transform;
 
que solo calcula la distancia de el player en un solo enemigo.
 
 
 
Agradeceria una idea gracias!!!
 
 
 
 
#7
General (Antiguo) / Serializar objetos( Resuelto)
Septiembre 10, 2018, 01:46:11 PM
Cita de: lightbug date=1536540609No se puede serializar un GameObject por ese método, podés hacerlo con cosas simples y genericas de C# (int, string, float etc), por ej al guardar una escena en Unity sí estás serializando todo dentro de un .unity, pero eso lo hace Unity, tu herramienta es el System.Serializable y el SerializableField,  si querés algo más avanzado tenés assets que manejan esto con GameObjects y te permiten cargar/guardar los resultados en binario. Ahora tenés que pensar, para que queres guardar ese GameObject? por que mejor no guardas su posición (tres floats) y al cargarlo lo instancias (de tu base de datos)?, yo hacía esto. Empezá a pensar como hacen estas cosas los juegos y vas a ver que todo es una ilusión, pocas cosas se guardan tal cual, una por tiempos de guardado, otra puede ser por tamaño, pero en realidad supongo que se hace para aprovechar la repetitividad de la partida, dependerá del tipo de juego.
   


Gracias de nuevo lightbug , hora lo veo de otro enfoque y partire desde este punto de vista.
 
Muchas gracias por la ayuda y el tiempo.
 
Saludos cordiales!!
#8
General (Antiguo) / Serializar objetos( Resuelto)
Septiembre 10, 2018, 12:05:56 AM
gracias lighbug , creo que entiendo lo que me quieres decir , y si por ejemplo tengo un libro en la pantalla que al colisionar me añade la función y el icono de lightbolt por ejemplo.
 
ese icono se queda en la pantalla y se activa un script el cuel me permite tirar ese lightball.
 
pero , si salgo de la partida ese icono y ese lighbolt no esta , solo queda guardado el mana y la vida, a eso me refiero.
 
Para guardar la partida como aun no he conseguido hacerlo con serialización lo ago asi:
 

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
 
public class Player : MonoBehaviour
{
    public float pX;
    public float pY;
    public float pZ;
 
    void Start()
    {
        // Check if the values have been saved
        if (PlayerPrefs.GetInt("Saved") == 1)
        {
            pX = PlayerPrefs.GetFloat("p_x");
            pY = PlayerPrefs.GetFloat("p_y");
            pZ = PlayerPrefs.GetFloat("p_z");
            transform.position = new Vector3(pX, pY, pZ);
            // Reset, so that the save will be used only once
            PlayerPrefs.SetInt("Saved", 0);
            PlayerPrefs.Save();
        }
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            position_save();
            Debug.Log("Save");
        }
        if (Input.GetKeyDown(KeyCode.L))
        {
            position_load();
            Debug.Log("Load");
        }
    }
    void position_save()
    {
        PlayerPrefs.SetFloat("p_x", transform.position.x);
        PlayerPrefs.SetFloat("p_y", transform.position.y);
        PlayerPrefs.SetFloat("p_z", transform.position.z);
        PlayerPrefs.SetInt("Saved", 1);
        // You need to actually save the values!
        PlayerPrefs.Save();
    }
    void position_load()
    {
        SceneManager.LoadScene("cofres");
    }
}

 
que evidentememte esto es pasajero porque no lo guarda en disco pero ese es otro tema.
 
he intentado agregar el objetoque hace esas cosas(lo del lightbol etc) el la serializacion:
 

public GameObject player;
public GameObject librofirebolt;

 
etc etc
 
y despues agegarlos al script existente:
 

public void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
        PlayerData data = new PlayerData();
        
        data.player = player;
        data.librofirebolt= librofirebolt;
    
       
        bf.Serialize(file, data);
        file.Close();
    }

 
 
 
etc pero nada , sigue sin guardarlos :(
 
 
 
 
 
 
#9
General (Antiguo) / Serializar objetos( Resuelto)
Septiembre 09, 2018, 11:00:23 PM
Buenas a todos, sere lo mas claro posible, empece un proyecto al estilo witcher3 , un mago con echizos etc.
 
Consegui que se guardara la posición de el personaje y los valores de vida y  mana, pero ahora me encuentro que ese echizo que aprendio el personaje ayer hoy no esta aprendido porque no se guarda(canvas imagenes etc).
 
La pregunta es, alguien me da una idea de como implementar estos objetos y que se guarden como lo del mana y la vida?, mire tutos y cofeccione esto por mi cuenta satisfactoriamente.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class GameControl : MonoBehaviour
{
    public static GameControl control;
    public float vida;
    public float mana;
   
    //public GameObject ballfire;
    void Awake()
    {
        if (control == null)
        {
            DontDestroyOnLoad(gameObject);
            control = this;
        }
        else if (control != this)
        {
            Destroy(gameObject);
        }
    }
    public void Save()
    {
        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Create(Application.persistentDataPath + "/playerInfo.dat");
        PlayerData data = new PlayerData();
       
        data.vida = vida;
        data.mana = mana;
       
        bf.Serialize(file, data);
        file.Close();
    }
    public void Load()
    {
        if (File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
            PlayerData data = (PlayerData)bf.Deserialize(file);
            file.Close();
            vida = data.vida;
            mana = data.mana;
           
           
        }
 
    }
}
[System.Serializable]
public class PlayerData
{
    public float vida;
    public float mana;
    //public GameObject ballfire;
   
 
}
 

 
con esto lo llamo desde cualquier parte y me guarda los valores vida y mana, pero como meto aqui los objetos, por ejemplo el mago encuentra un libro el cual le otorga un nuevo echizo que aparece en su barra de echizos(imagenes canvas que se ativan etc)??
 
O debo de meter el script aqui dentro? usando updates y voids starts?
 
 
 
gracias de antemano
#10
General (Antiguo) / quitar vida a scipt enemigo
Agosto 04, 2018, 11:03:32 PM
Antes de nada gracias #FrancoSP y juanma_teso.
 
He probado la propuesta de Franco, sigue dando el mismo error, lo que dice juanma tambien tiene sentido pero he probado con un solo enemigo con ese nombre exacto y tampoco funciona...yo tambien estoy aprendiendo pero creia que esto ya lo dominaba ..pues no.
 
Lo e puesto tal cual me comentais y nada:
 
 
 

public Health Enemigo;
void Start()
    {
        anim=GetComponent<Animation>();
        particulascamina.SetActive(false);
        GetComponent<AudioSource>().enabled = false;
        audiopega.enabled = false;
        Enemigo = GameObject.Find("enemigo").GetComponent<Health>();

 
y en el parrafo de ataque
 
 
 

else if (ataca)
        {
            GetComponent<Animation>().CrossFade("vc_uppercut_jab");
            audiopega.enabled = true;
            if (attackDist <=2f)
            {
             Enemigo.vida -= 80f * Time.deltaTime;
            }

 
pero el mismo error
 
que no encuentra el objeto :(
 
Claro porque soy tonto.....como me va a encontrarlo...el fallo es mio, y vosotros me lo habeis echo ver XDD
 
el script enemigo no se llama Health...ese es el de mi personage principal XDD se llama Healthenemiga....el otro problema que tengo es lo de la distancia pero eso es otro tema
 
aqui la resolución para posibles visitas:
 
 
 

public Healthenemiga Enemigo;/////////////asi se llama el script que quiero acceder.
 void Start()
    {
        anim=GetComponent<Animation>();
        particulascamina.SetActive(false);
        GetComponent<AudioSource>().enabled = false;
        audiopega.enabled = false;
        Enemigo = GameObject.Find("enemigo").GetComponent<Healthenemiga>();////////////// start correcto!!!
 
else if (ataca)
        {
            GetComponent<Animation>().CrossFade("vc_uppercut_jab");
            audiopega.enabled = true;
            if (attackDist <=2f)
            {
             Enemigo.vida -= 80f * Time.deltaTime;//////////quito vida correcto!!!
                       
            }

 
no se si de haberlo puesto al principio funcionase....pero asi funciona almenos con un enemigo :P
 
Mil gracias!!
 
 
 
 
#11
General (Antiguo) / quitar vida a scipt enemigo
Agosto 04, 2018, 05:10:19 PM
Buenas tardes a todos/todas, cada vez que unity cambia de versión algo cambia en el codigo....
 
Aver estoy haciendo algo sencillo,tengo unos monigotes enemigos llamados "enemigo", los cuales tienes un script llamado Health.
 
Bien , la idea es que quiero quitarles vida, para ello los busco en este afragmento de codigo:
 

else if (ataca)
        {
            GetComponent<Animation>().CrossFade("vc_uppercut_jab");
            audiopega.enabled = true;
            if (attackDist <=2f)
            {
              GameObject.Find("enemigo").GetComponent<Health>().vida -= 80f * Time.deltaTime;
             
            }

 
busco el objeto, (enemigo). le cojo el script(health). y realizo lo que hace en este caso le quita vida cada segundo.
 
Pero nada...no me encuentra el enemigo.....me tira este error en la linea donde esta el find...
 
NullReferenceException: Object reference not set to an instance of an object
 
alguna idea por favor?
 
Gracias de antemano
 
 
 
 
 
 
 
 
 
 
 
 
#12
General (Antiguo) / Capturar String de Inputfield(Resuelto)
Septiembre 24, 2017, 04:23:35 PM
Amigos muchísimas gracias, que ciego estoy, lo comprendo perfectamente.
 
#Leocub58
 
#juanma_teso
 
Las dos respuestas son geniales, gracias por la rapidez y la ayuda.
 
La cosa ha quedado asi y parece que funciona:
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
 
public class Loguin : MonoBehaviour
{
public InputField insertarcodigo;
public string codigo;
 
void Start()
{
//      codigo = insertarcodigo.text;
//      PlayerPrefs.SetString("Codigo",codigo);
//      PlayerPrefs.Save();
}
void Update()
{
   codigo = insertarcodigo.text;
   PlayerPrefs.SetString("Codigo",codigo);
   PlayerPrefs.Save();
   if (Input.GetKeyDown ("space"))
   {
      
      PlayerPrefs.GetString ("Codigo");
      Debug.Log ("El codigo es:" + PlayerPrefs.GetString ("Codigo"));
   }
}
}

 
Si voy bien os agradecería que me lo indicaseis .
 
Gracias!!
 
 
 
 
 
 
#13
General (Antiguo) / Capturar String de Inputfield(Resuelto)
Septiembre 24, 2017, 03:48:45 PM
Buenas tardes, agradecería por favor una mano en un pequeño problema que tengo.
 
Estoy terminando un proyecto y ahora me encuentro con esto...
 
La cosa es sencilla , tengo un simple inputfield el cual me deja insertar lo que quiera..
 
Lo que intento es capturar esa String en un playerpreff para luego usar ese texto en otra pantalla.
 
Prove esto;
 

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
 
public class Loguin : MonoBehaviour
{
public InputField insertarcodigo;
string codigo;
 
void Start()
{
   PlayerPrefs.SetString("Codigo",codigo);
   PlayerPrefs.Save();
}
void Update()
{
   if (Input.GetKeyDown ("space"))
   {
      codigo = insertarcodigo.text;
      PlayerPrefs.GetString ("Codigo");
      //Debug.Log ("El codigo es:" + codigo);
      Debug.Log ("El codigo es:" + PlayerPrefs.GetString ("Codigo"));
   }
}
}

 
pero nada, cuando llamo al pref GetString pensaba que me cojeria la string de codigo pero no.
 
si le llamo al debug directamente a la string(codigo), si me lo da pero lo que quiero es que me la guarde y no lo hace.
 
Agradecería una ayuda por favor, asi puedo terminar este proyecto. muchas gracias de antemano.
 
 
 
 
 
 
 
 
#14
Cita de: lightbug date=1504627368Ah bueno mejor. Lo del vector2 up lo decia simplemente a modo de ejemplo podes usar el vector que quieras, incluso podrias tener un gizmo que lo represente entonces sabes antes de darle play para donde saldrá. podria ser por ej:
   
   

//a 45° siempre
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Vector3.right) );
//o si queres algo mas aleatorio ponele valores (inventados aca) random al right
//de 20° a 60°
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Random.Range(valorQueLoHace20,valorQueLoHace60) * Vector3.right) );

   
      Saludos
   


Brutal!, muchisimas gracias de nuevo esto le da un nuevo enfoque a la cosa.
 
Gracias
 
 
#15
Cita de: lightbug date=1504575875no tendria que rebotar? si es el Arkanoid el que pienso que es...
   
   
      fijate que en dentro del onCollision cuando moris la bola tiene su velocity, "quizas" cuando decidis ponerlo en kinematico esa velocity se conserva, cuando le das devuelta para lanzar la bola con el ADD force "puede que" le agregue mas fuerza del que traia... y a eso que le cambias de golpe la posicion... no se ...que se yo una suposicion. Proba agregar esto:
   
   

if (ballIsActive)
{   
  Debug.Log ("muere");
  ballIsActive = false;   //no es necesario el !, ya estas en ballIsActive!!
  ballPosition.x = playerObject.transform.position.x;
  ballPosition.y = -4.5f;
 
  //por pasos primero anula la velocidad
  rb.velocity = Vector2.zero;   //<<<-----
 
  //luego movelo
  //como estas modificando el transform directamente podes hacer MovePosition
  rb.MovePosition(ballPosition);  
 
  playerObject.SendMessage ("TakeLife");
}

   
       
   
   
      y en:
   
   

if (!ballIsActive)
{  
  rb.velocity = Vector2.up * velocidad; //elegi una velocidad constante
  ballIsActive = true; //otra vez no es necesario invertir
}

   
       
   
   
      No se en concreto en tu caso que será pero con probar no perdes nada.
   
   
      Para un juego de este tipo te diria que uses el physicsMaterial (por default para todo objeto, en opciones de proyecto) tiene que ser tal que todo rebote, es decir que podes en vez de darle un fuerza darle una velocidad directamente y todo deberia comportarse bien. Un esquema podria ser.
   
   

if(!bolaActiva){
  if( input )
  {
bolaActiva = true;  
Rb_Bola.velocity = velocidad * Vector2.up;    
  }
}else{

if(condicionPerder)
{
   bolaActiva = false;
   bola.position = plataformaPos;
   Rb_Bola.velocity = Vector2.zero;
}
}

   
      saludos
   


Llightbug has dado en el clavo e lleno!!!, el problama era cuando moria, no se reseteabaj la velocidad!!, se la llevaba con ella, era justamente eso ponerle el vector 2 a 0, eres um genio!, y si por supuesto le tengo un physisc material a la bola que es bounce friction0 bounce 0 y rebota bien :), lo del vector2 up, lo probe pero el problema es que se va recta hacia arriba y eso impide que coja angulos de rebote osea que sube i baja como un ascensor.
 
Al ponerle esto: ballInitialForce = new Vector2 (50.0f,300.0f); me coje 50 de la x / 300 de la y y sale un pelin torcida asi rebota bien de echo con un 100 basta.
 
 
 
Muchisimas gracias!!!!!!
 
Un abrazo.