Noticias

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

Restablezer vida al istante

Iniciado por brok, Noviembre 18, 2015, 02:42:44 PM

Tema anterior - Siguiente tema
Tengo problema que la vida del enemigo no se regenera la vida al istante lo hace cuando le da la gana y asin me cargo a varios enemigos, sin quitarle vida porque se queda a 0 ¿que puedo hacer para que se regenere mas rapido y estable?.using UnityEngine;
using System.Collections;public class vidaAI : MonoBehaviour {
    public delegate void DeathEvent();
    public event DeathEvent Death;
    public int scoreValue = 10;
    public static int vidaEnemigo = 100;
    public static int vidaEnemigoAI;
    bool isDead;
    ParticleSystem hitParticles;
    void Start ()
    {
        vidaEnemigoAI = vidaEnemigo;
        hitParticles = GetComponentInChildren<ParticleSystem>();
        Death += () => { Destroy(gameObject); };
            }
    
    
    public static int GetVidaPorcentage()
    {
       
        return 100 * vidaEnemigoAI / vidaEnemigo;
            }    public void QuitarVidaAI(int amount, Vector3 hitPoint)
    {
        if (isDead)
            return;
        hitParticles.transform.position = hitPoint;
        hitParticles.Play();
        vidaEnemigoAI -= amount;
        if (vidaEnemigoAI <= 0f) if (Death != null) Death();
        if (vidaEnemigoAI <= 0)
        {
            
            ScoreManager.score += scoreValue;
            isDead = true;
        }
    }
    

Noviembre 18, 2015, 04:15:45 PM #1 Ultima modificación: Noviembre 18, 2015, 04:17:49 PM por francoe1
Ya te he solucionado tal problema y has modificado el código de una forma brusca, tanto que no te funciona.¿Que controla este componente?
 - Existe un gran problema de diseño, o directamente no existe tal, te invito a que detengas el proyecto, y lo empieces por diseñar a mano en una hoja. No es necesario redactar un GDD, con un simple documento de orientación ya serviria.  ¿A qué se debe la mala implementacion de vidaEnemegoIA?
"NO SE USAN VARIABLES ESTÁTICAS PARA ESTOS CASOS"¿Tenes un gran utilidad llamada Evento, y creaste una variable de tipo BOOL que reemplace tal?
 - La Diferencia es que en esta necesitaras comprobar continuamente en una función de bucle del juego, ej Update, para comprobar su valor
 
if(isDead) Hacer....
 - Cuando trabajas con eventos las cosas funcionan totalmente distintas, vos no implementas esto (SI tal X Evento), se lo hace de la siguiente manera Evento > Función (Se Generó tal evento Hacemos X), Solo se llaman una vez, EJ en la función Start.
Evento += Función;
 * Los Eventos tienen múltiples ventajas y una de ellas es su óptimo rendimiento y flexible implementacion. Entonces ¿Cómo Solucionamos tu problema?1º Analizemos el Proyecto, ¿Que quieres lograr?2º Analizemos cada Actor , ¿Como es el Persona Principal?, ¿Que puede hacer?, ¿Existe IA o solo es Acción<->Evento?3º Analizar en detalle qué componentes deberias utilizar para tal. EJ : Personaje Principal -> InputManager -> Movement -> Animator -> HealtControl4º Normalizar componente, es decir, que no exista redundancia de datos. EJ: Para Todos los Actores, no importa que sea el Jugador o un Actor del Sistema vamos a utilizar los mismos componentes, Movement -> Animator -> HealtControl.5º Diseñar los Componentes, para este paso lo mejor es HOJA Y LÁPIZ, el diseño de tal, tiene que ser comprendido por cualquier persona, esto quiere decir, no pienses como programarlo, Diseña tus Eventos, y Acciones,  EJ ¿Qué pasa si?.
        ****TIPS****   Para esta clase de diseño, es conveniente utilizar evento relacion, esto se veria de la siguiente manera.
       Actor>Action(Lanza Puñetazo)>¿Di con el Objetivo?>GetTarget>ApplyDamage(Target)>InfoToManager.
       Esto es fácil de comprender para cualquier persona, se leería de esta manera, Actor lanza un puñetazo si este colisiona con el objetivo convierte el objetivo como su target y luego le aplica daño.6º Teniendo todos estos pasos totalmente armados, los analizamos, y volvemos a aplicar una ligera normalización.7º ¡Es hora de programar!La satisfacción más grande para un programador es terminar su cometido con buenos resultados,  y lo único que te lleva a esto es, Amar lo que haces, ser ordenado, diseñar y analizar la problemática, estar dispuesto a aprender y leer, aprender matemáticas, ejercitar bastante y por supuesto, las 2 mas importante, ***verancia y Responsabilidad. Espero sea de tu agrado leer y tratar de entender las cosas, entonces no tendrias estos problemas tan simples.
PD: Espero que esto sea leído por otros usuarios que se encuentran en constantes problemas similares, para que entiendan cómo funciona y puedan seguir adelante sin código masticado.[/quote]Saludos.

Bueno gracias por los consejos, esto para mi es un hobby no soy programador pero algo se y estoy dispuesto a aprender solo que no es tan facil para mi tengo pocos estudios soy de todo un poco, saludos.

Lo he modificado como estaba francoe1 y no se regenera la vida el Slider pero lo demas funciona bien, las colisiones y restarle la vida al enemigo todo va bien menos eso dejo 2 script el del player y el vidaAI;using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Player : MonoBehaviour {
    Transform player;
    public Animator Anim;
    private float correr;
    public float speed = 2f;
    public float speed2 = 6f;
    Vector3 AngularVelocidad;
    public float gravity = 20.0F;
    private Vector3 moveDirection = Vector3.zero;
    public float jumpSpeed = 1.0F;    public Image damageImage;
    public Slider playerSlider;
    public static bool damaged;
    public float flashSpeed = 5f;
    public int Salto = 2;
    public Color flashColour = new Color(1f, 0f, 0f, 0.1f);
    public Slider sliderAI;
    vidaAI vidaAi;
    Transform TargetAi;    void Awake()
    {
       sliderAI.gameObject.SetActive(false);
    }
        void Start () {        Anim = GetComponent<Animator>();
        TargetAi = GameObject.FindGameObjectWithTag("Enemigo").transform;
        vidaAi = TargetAi.GetComponent<vidaAI>();
    }
    
    // Update is called once per frame
    void Update () {        
        
        if (damaged)
        {
            damageImage.color = flashColour;
        }
        else
        {
            damageImage.color = Color.Lerp(damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
        }
        damaged = false;
        sliderAI.value = vidaAi.vidaEnemigoAI;
        playerSlider.value = vidaPlayer.vida;
        transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed * Time.deltaTime, Space.World);
        transform.Translate((Input.GetAxisRaw("Horizontal")) * speed * Time.deltaTime, 0, 0);        
     
                Anim.SetFloat("andar", Input.GetAxis("Horizontal"));        Anim.SetFloat("andar", Input.GetAxis("Vertical"));
        Anim.SetFloat("correr", correr);        if (Input.GetAxis("Horizontal") == -1)
        {            Anim.SetFloat("andar", 2f);
        }        if (Input.GetAxis("Horizontal") == 1)
        {            Anim.SetFloat("andar", 2f);
        }
        if (Input.GetAxis("Vertical") == -1)
        {            Anim.SetFloat("andar", 2f);
        }        if (Input.GetButton("Jump"))
        {
            
            transform.Translate(0, 1, 3 * speed * Time.deltaTime);
            Anim.SetBool("salto", true);
            
        }        else
        {
            Anim.SetBool("salto", false);
        }        if (Input.GetButton("Fire2"))
        {
            Anim.SetBool("patada", true);
            
        }
        else
        {
            Anim.SetBool("patada", false);
        }
        if (Input.GetButton("Fire1"))
        {
            Anim.SetBool("punetazo", true);
        }
        else
        {
            Anim.SetBool("punetazo", false);
        }
        if (Input.GetButton("Fire3"))
        {
            correr = 0.2f;
            transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed2 * Time.deltaTime, Space.World);
        }
        else
        {
            correr = 0.0f;
        }
        CharacterController controller = GetComponent<CharacterController>();
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * 10 * Time.deltaTime);
    }   }
Otro Scipt. using UnityEngine;
using System.Collections;public class vidaAI : MonoBehaviour {
    public delegate void DeathEvent();
    public event DeathEvent Death;
    public int scoreValue = 10;
    public int vidaEnemigoAI;
    ParticleSystem hitParticles;
    public int MaxHealt = 100;
    public int MinHealt = 0;
    void Start ()
    {
        if (vidaEnemigoAI == 0)
        vidaEnemigoAI = MaxHealt;
        hitParticles = GetComponentInChildren<ParticleSystem>();
        Death += () => { Destroy(gameObject); };
        
   }
    void Update()
    {
        ApplyCure(0);
    }   
    internal void QuitarVidaAI(int Value, Vector3 hitPoint)
    {
        vidaEnemigoAI -= Value;
        vidaEnemigoAI = Mathf.Clamp(vidaEnemigoAI, MinHealt, MaxHealt);
        if (vidaEnemigoAI <= MinHealt) if (Death != null) Death();        hitParticles.transform.position = hitPoint;
        hitParticles.Play();
        if (vidaEnemigoAI <= 0)
        {
            
            ScoreManager.score += scoreValue;
            
        }
    }
    internal void ApplyCure(int Value)
    {
        if (vidaEnemigoAI <0)
        vidaEnemigoAI += Value;
        vidaEnemigoAI = Mathf.Clamp(vidaEnemigoAI, MinHealt, MaxHealt);
        
    }
    } 


Etiquetas: