Hitler - RusiaDefense

Programación Orientada a Objetos (Tower defense - kingdom rush)

Moderator: julianmartinez16

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Tue Apr 09, 2019 12:14 pm

¿que se hizo?
se logro hacer que las torres reconozcan enemigos y los ataquen en base a un circulo y su collider; en el hover se hizo que se muestre el rango antes de colocar la torre, que estas muestren el mismo cuando cuando se le clickea, se hizo que dejen de reconocer los monstruos cuando salen de su rango y que no les disparen; se le dio unas propiedades a las flechas de velocidad; se implemento el sistema de oleadas 2.0 para que no salgan enemigos dando click al boton constantemente, si no que saldran dependiendo de la wave en la que vaya; se implemento la vida del jugador que se ira reduciendo en uno cada vez que un enemigo logre llegar al portal final.
¿que se va a hacer?
se hara un clasificacion de tiles donde se pueda decir si se pueden colocar o no torres en este y se usara el mismo algoritmo para que los enemigos sepan por que tipo de tiles deberan pasar
¿algun problema?
hay un pequeño bug que ocasiona que de la segunda oleada en adelante el enemigo desaparece y por ende no se puede avanzar a la siguiente oleada(esta en correccion).

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;

public class DebugTile : MonoBehaviour
{
    [SerializeField]
    private Text f;

    [SerializeField]
    private Text g;

    [SerializeField]
    private Text h;

    public Text F
    {
        get { f.gameObject.SetActive(true); return f; }
        set => f = value;
    }
    public Text G
    {
        get { g.gameObject.SetActive(true); return g; } set => g = value;
    }
    public Text H
    {
        get { h.gameObject.SetActive(true); return h; }
         set => h = value;
    }
}

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tower : MonoBehaviour
{
    [SerializeField]
    private string projectileType;
    [SerializeField]
    private float projectileSpeed;
    public float ProjectileSpeed
    {
        get { return projectileSpeed; }
    }

    private SpriteRenderer mySpriteRenderer;

    private Monster target;
    public Monster Target
    {
        get { return target; }
    }

    private Queue<Monster> monsters = new Queue<Monster>();

    private bool canAttack = true;

    private float attackTimer;
    [SerializeField]
    private float attackCooldown;
    // Start is called before the first frame update
    void Start()
    {
        mySpriteRenderer = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        Attack();
    }

    public void Select()
    {
        mySpriteRenderer.enabled = !mySpriteRenderer.enabled;
    }

    private void Attack()
    {
        if (!canAttack)
        {
            attackTimer += Time.deltaTime;
            if (attackTimer >= attackCooldown)
            {
                canAttack = true;
                attackTimer = 0;
            }
        }

        if (target == null && monsters.Count > 0)
        {
            target = monsters.Dequeue();
        }
        if (target != null)
        {
            if (canAttack)
            {
                Shoot();
                canAttack = false;
            }
        }
    }

    private void Shoot()
    {
        Projectile projectile = GameManager.Instance.Pool.GetObject(projectileType).GetComponent<Projectile>();
        projectile.transform.position = transform.position;
        projectile.Initialize(this);
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Monster")
        {
            monsters.Enqueue(other.GetComponent<Monster>());
        } 
    }
    public void OnTriggerExit2D(Collider2D other)
    {
        if (other.tag == "Monster")
        {
            target = null;
        }
    }

}

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
using UnityEngine;
using UnityEngine.SceneManagement;

public class GameManager : Singleton<GameManager>
{
 

    public TowerBtn ClickedBtn { get ;  set ; }
   

    private int currency;
    [SerializeField]
    private Text currencyTxt;
    [SerializeField]
    private GameObject waveBtn;

    List<Monster> activeMonsters = new List<Monster>();

    private int wave = 0;

    private int lives;

    private bool gameOver = false;
    [SerializeField]
    private Text liveTxt;
    [SerializeField]
    private Text waveText;
    [SerializeField]
    private GameObject gameOverMenu;

    private Tower selectedTower;

    public Objectpool Pool { get; set; }
    public int Currency
    {
        get { return currency; }

        set
        {
            this.currency = value;
            this.currencyTxt.text = value.ToString() + "$";
        }
    }
    public int Lives
    {
        get { return lives; }

        set
        {
            this.lives = value;
            

            if (lives <= 0)
            {
                this.lives = 0;
                GameOver();
            }
            liveTxt.text = value.ToString();
        }
    }
    public bool WaveActive
    {
        get { return activeMonsters.Count > 0; }
    }
    

    // Start is called before the first frame update
    void Start()
    {
        Lives = 1;
        Currency = 18;
    }

    private void Awake()
    {
        Pool = GetComponent<Objectpool>();
    }
    // Update is called once per frame
    void Update()
    {
        HandleEscape();
    }

    public void PickTower (TowerBtn towerBtn)
    {
        if (Currency >= towerBtn.Price && !WaveActive)
        {
            this.ClickedBtn = towerBtn;
            Hover.Instance.Activate(towerBtn.Sprite);
          
        }

        

    }

    public void BuyTower()
    {
        if (Currency >= ClickedBtn.Price)
        {
            Currency -= ClickedBtn.Price;
            Hover.Instance.DeActivate();
        }
        
       
    }

    private void HandleEscape()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {

            Hover.Instance.DeActivate();
            ClickedBtn = null;
        }
    }

    public void SelectTower(Tower tower)
    {
        if (selectedTower != null)
        {
            selectedTower.Select();
        }
        selectedTower = tower;
        selectedTower.Select();
    }

    public void DeselectTower()
    {
        if (selectedTower != null)
        {
            selectedTower.Select();
        }
        selectedTower = null;
    }

    public void StartWave()
    {

        wave++;
        waveText.text = string.Format("wave: <color=lime>{0}</color>", wave);


        StartCoroutine(SpawnWave());

        waveBtn.SetActive(false);
    }
   private IEnumerator SpawnWave()
    {
        LevelManager.Instance.GeneratePath();
        for (int i = 0; i < wave; i++)
        {

            int monsterIndex = 0;

            string type = string.Empty;
            switch (monsterIndex)
            {
                case 0:
                    type = "Hitler";
                    break;
            }

            Monster monster = Pool.GetObject(type).GetComponent<Monster>();
            monster.Spawn();
            activeMonsters.Add(monster);
            yield return new WaitForSeconds(2.5f);
            
        }
        

    }

    public void RemoveMonster(Monster monster)
    {
        activeMonsters.Remove(monster);

        if (!WaveActive && !gameOver)
        {
            waveBtn.SetActive(true);
        }
    }

    public void GameOver()
    {
        if (!gameOver)
        {
            gameOver = true;
            gameOverMenu.SetActive(true);
        }
    }

    public void Restart()
    {
        Time.timeScale = 1;
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }

    public void QuitGame()
    {
        Application.Quit();

    }
}
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Thu Apr 11, 2019 7:15 am

¿que se hizo?
se logro hacer que los bichos avance por el camino de tierra y utilizando la misma lógica se hizo que las torres no se puedan colocar en el camino por donde pasaran los bichos
¿que se hara?
se implementara el sistema de vida en los enemigos y se implementara el sistema de daño en los proyectiles de la torre... a la par que se desarrollara que cada vez que un enemigo muera genere recursos para la siguiente oleada
¿algun problema?
aun esta presente el bug de las oleadas(se esta buscando una solucion), me di cuenta de un pequeñisimo bug que ocasiona que en algunos tiles no se coloquen torres de manera correcta y en caso de lograrse colocar en algunos casos no deja visualizar el rango que estas presentan(se buscara solucion a esto tambien).

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using UnityEngine;

public class TileScript : MonoBehaviour
{
    public Point GridPosition { get; set; }

    public bool isEmpty { get; private set; }

    private Tower myTower;
    private Color32 fullColor = new Color32(255, 118, 118, 255);
    private Color32 emptycolor = new Color32(96, 255, 90, 255);

    private SpriteRenderer spriteRenderer;
   

    public bool walKable  {get;set;}

    public bool Debugging { get; set; }

    public Vector2 WorldPosition
    {
        get
        {
            return new Vector2(transform.position.x + (GetComponent<SpriteRenderer>().bounds.size.x / 2), transform.position.y - GetComponent<SpriteRenderer>().bounds.size.y / 2);
        }

    }
    // Start is called before the first frame update
    void Start()
    {
       spriteRenderer = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void Setup(Point gridPos, Vector3 worldPos, Transform parent, bool empty, bool walk)
    {
        walKable = walk;
        isEmpty = empty;
        this.GridPosition = gridPos;
        transform.position = worldPos;
        transform.SetParent(parent);
        //LevelManager.Instance.Tiles.Add(gridPos,this);
       

         
            
    }

    private void OnMouseOver()
    {
        ColorTile(fullColor);
        if (!EventSystem.current.IsPointerOverGameObject() && GameManager.Instance.ClickedBtn != null)
        {
            if (isEmpty && !Debugging)
            {
                ColorTile(emptycolor);
            }
            if (!isEmpty && !Debugging)
            {
                ColorTile(fullColor);

            }
            else if (Input.GetMouseButtonDown(0))
            {
                
                    PlaceTower();
            
                    
            }
        }
        else if (!EventSystem.current.IsPointerOverGameObject() && GameManager.Instance.ClickedBtn == null && Input.GetMouseButtonDown(0))
        {
            if (myTower != null)
            {
                GameManager.Instance.SelectTower(myTower);
            }
            else
            {
                GameManager.Instance.DeselectTower();
            }
        }
        
        
    }

    private void OnMouseExit()
    {
        if (!Debugging) { ColorTile(Color.white); }
       
    }

    private void PlaceTower()
    {
       
            GameObject tower = (GameObject)Instantiate(GameManager.Instance.ClickedBtn.TowerPrefab, transform.position, Quaternion.identity);
            tower.GetComponent<SpriteRenderer>().sortingOrder = GridPosition.Y;
            tower.transform.SetParent(transform);
            this.myTower = tower.transform.GetChild(0).GetComponent<Tower>();

            isEmpty = false;
            ColorTile(Color.white);
            GameManager.Instance.BuyTower();

            walKable = false;
               

    }
    private void ColorTile(Color32 newColor)
    {
       spriteRenderer.color = newColor; 
    }


}

Code: Select all

using System.Collections.Generic;
using UnityEngine;
using System;

public class LevelManager : Singleton<LevelManager>{

    [SerializeField]
   
    private GameObject[] tilePrefabs;

    [SerializeField]
    private CamaraMovement cameraMovement;

    [SerializeField]
    private Transform map;

  
    
    private Point redSpawn, blueSpawn;
    
    [SerializeField]
    private GameObject bluePortalPrefab;

    [SerializeField]
    private GameObject redPortalPrefabs;

    public Portal BluePortal { get; set; }

    private Point mapSize;

    private Stack<Node> path;
    public Stack<Node> Path
    {
        get
        {
            if (path == null)
            {
                GeneratePath();
            }
            return new Stack<Node>(new Stack<Node>(path));
        }
        
    }

  public Dictionary<Point, TileScript> Tiles { get; set; }

   




    public float TileSize
    {
        get { return tilePrefabs[0].GetComponent<SpriteRenderer>().sprite.bounds.size.x; }
    }

    public Point BlueSpawn { get => blueSpawn;  }

    // Use this for initialization
    void Start()
    {
       

        CreateLevel();
        
    }

    // Update is called once per frame
    void Update()
    {

    }

    

   

    private void CreateLevel()
    {

        Tiles = new Dictionary<Point, TileScript>();


        // string[] mapData = new string[]
        // {
        //    "0000", "1111", "2222","3333","4444","5555"
        //};
        string[] mapData = ReadLevelText();

        mapSize = new Point(mapData[0].ToCharArray().Length, mapData.Length);
     


        int mapXSize = mapData[0].ToCharArray().Length;
        int mapYsize = mapData.Length;

        Vector3 maxTile = Vector3.zero;
        

        //calcula el tamañio de los archivos, para luego colocarlos en posiciones correctas

        Vector3 worldStart = Camera.main.ScreenToWorldPoint(new Vector3(0,Screen.height));
        for (int y = 0; y < mapYsize; y++)//las posiciones de y
        {

            char[] newTiles = mapData[y].ToCharArray();

            for (int x = 0; x < mapXSize; x++)//las posiciones de x
            {
                long block = long.Parse(newTiles[x].ToString());

                if (block == 0)
                {
                    Placetile(newTiles[x].ToString(), x, y, worldStart,false,true);
                }

                if (block == 1)
                {
                    Placetile(newTiles[x].ToString(), x, y, worldStart,true,false);
                }
                //crea nuevos tiles y hace referencias a estos tile en los neuvos tiles
            

            }
        }

        maxTile = Tiles[new Point(mapXSize-1,mapYsize-1)].transform.position;

        cameraMovement.SetLimits(new Vector3(maxTile.x + TileSize, maxTile.y - TileSize));

        SpawnPortals();

    }
    private void Placetile(string tileType, int x, int y,Vector3 worldStart, bool empty, bool walk)
    {
        int tileIndex;
        if (int.TryParse(tileType, out tileIndex))
        {
            TileScript newTile = Instantiate(tilePrefabs[tileIndex]).GetComponent<TileScript>();
            newTile.Setup(new Point(x, y), new Vector3(worldStart.x + (TileSize * x), worldStart.y - (TileSize * y), 0), map, empty, walk);
            Tiles.Add(new Point(x, y), newTile);
        }
        

       

      
    }
    private string[] ReadLevelText()
    {
        TextAsset binData = Resources.Load("Level") as TextAsset;
        string data = binData.text.Replace(Environment.NewLine, string.Empty);
        return data.Split('-');
    }

    private void SpawnPortals()
    {
        blueSpawn = new Point(0,0);

       GameObject tmp = (GameObject) Instantiate(bluePortalPrefab, Tiles[BlueSpawn].GetComponent<TileScript>().WorldPosition, Quaternion.identity);
        BluePortal = tmp.GetComponent<Portal>();

        BluePortal.name = "portaal";
        redSpawn = new Point(17, 6);

        Instantiate(redPortalPrefabs, Tiles[redSpawn].GetComponent<TileScript>().WorldPosition, Quaternion.identity);
    }

    public bool InBounds(Point position)
    {
        return position.X >= 0 && position.Y >= 0 && position.X < mapSize.X && position.Y < mapSize.Y;
    }

    public void GeneratePath()
    {
        path = AStar.GetPath(BlueSpawn, redSpawn);
    }
}
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Wed Apr 17, 2019 7:28 pm

¿que se ha hecho?
POR FINNNNN... se corrigio el bug de las oleadas despues de dos dias de intento de correccion del error y de los imnumerables momento que se fue la energia en sincelejo(sucre); el sistema de oleadas ya funciona
¿que se va a hacer?
ya podre enfocarme en el sistema de rotacion de las flechas y muchas cosas mas como el sistema de daño y vida
¿algun problema?
despues de buscar donde estaba el error ninguna; LA VIDA ES BELLA

Image

parece que el gif se bugea y deja de salir debo buscar una alternativa
Image
solucion intentada con facebook(esta en periodo de prueba)
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Fri Apr 19, 2019 10:28 am

¿que se hizo?
se logro hacer que las flechas no sean sprites "estaticos", sino que roten en direccion al objetivo
¿que se va a hacer?
se implementaran las barras de vida y el daño, tambien la muerte del bicho... tratare de hacerlo todo hoy

¿algun inconveniente?
de codigo no, vivo con mi abuela y se puso muy mal , tuvimos que llevarla al hospital si no mejora la situacion lo mas probable es que no haga las barras de vida hoy, en otro caso lo hare

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Projectile : MonoBehaviour
{
    private Monster target;

    private Tower parent;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        MoveToTarget();
    }

    public void Initialize(Tower parent)
    {
        this.target = parent.Target;
        this.parent = parent;
    }

    private void MoveToTarget()
    {
        if (target != null)
        {
            transform.position = Vector3.MoveTowards(transform.position, target.transform.position, Time.deltaTime * parent.ProjectileSpeed);

            Vector2 dir = target.transform.position - transform.position;
            float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;

            transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        }
        else
        {
            GameManager.Instance.Pool.ReleaseObject(gameObject);
        }
    }
}

Image
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Wed Apr 24, 2019 12:41 am

¿que se hizo?
se hizo que la flecha desaparezca al entrar en contacto con el monstruo en lugar de quedarse aferrada a el hasta llegar al portal y se comenzaron a indicar los valores de vida para el daño de los proyectiles
¿que se va a hacer?
se implementara el sistema de vida y daño
¿algun problema?
de momento ninguno, todo fine

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tower : MonoBehaviour
{
    [SerializeField]
    private string projectileType;
    [SerializeField]
    private float projectileSpeed;
    [SerializeField]
    private int damage;
    public float ProjectileSpeed
    {
        get { return projectileSpeed; }
    }

    private SpriteRenderer mySpriteRenderer;

    private Monster target;
    public Monster Target
    {
        get { return target; }
    }

    public int Damage { get => damage; }

    private Queue<Monster> monsters = new Queue<Monster>();

    private bool canAttack = true;

    private float attackTimer;
    [SerializeField]
    private float attackCooldown;
    // Start is called before the first frame update
    void Start()
    {
        mySpriteRenderer = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        Attack();
    }

    public void Select()
    {
        mySpriteRenderer.enabled = !mySpriteRenderer.enabled;
    }

    private void Attack()
    {
        if (!canAttack)
        {
            attackTimer += Time.deltaTime;
            if (attackTimer >= attackCooldown)
            {
                canAttack = true;
                attackTimer = 0;
            }
        }

        if (target == null && monsters.Count > 0)
        {
            target = monsters.Dequeue();
        }
        if (target != null)
        {
            if (canAttack)
            {
                Shoot();
                canAttack = false;
            }
        }
    }

    private void Shoot()
    {
        Projectile projectile = GameManager.Instance.Pool.GetObject(projectileType).GetComponent<Projectile>();
        projectile.transform.position = transform.position;
        projectile.Initialize(this);
    }

    public void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Monster")
        {
            monsters.Enqueue(other.GetComponent<Monster>());
        } 
    }
    public void OnTriggerExit2D(Collider2D other)
    {
        if (other.tag == "Monster")
        {
            target = null;
        }
    }

}
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Thu May 02, 2019 10:59 am

¿que se ha hecho?
se creo la clase stat y barscript que se utilizaran al momento de utilizar el sprite de barra de vida y ayudara con el recibimiento de daño por parte del monstruo

¿que se hara?
se utilizara un sprite de barra de vida y cuando este se consiga se seguira con la programacion de la vida

¿alguna dificultad?
debido a no tener aun la barra de vida como tal visualmente se bugea un poco debido a que necesita datos de esta lo que ocasiona que el movimiento del personaje interpreta el algoritmo AStar pero no omite los sprites prohibidos, es decir, puede caminar por los cuadros verdes... por ahora solo se dejaran diseñados los codigos de Stat y Barscript pero no se usaran

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class BarScript : MonoBehaviour
{

    [SerializeField]
    private float fillAmount;

    [SerializeField]
    private Image content;

    public float MaxValue { get; set; }

    public float Value
    {
        set
        {
            //string[] tmp = valueText.text.Split(':');
            //valueText.text = tmp[0] + ": " + value;
            fillAmount = Map(value, 0, MaxValue, 0, 1);
        }
    }

    void Start()
    {
        //Value = 2;
    }

    void Update()
    {
        HandleBar();
    }

    private void HandleBar()
    {
        if (fillAmount != content.fillAmount)
        {
            content.fillAmount = fillAmount;
        }
    }

Code: Select all

using System.Collections;
using System.Collections.Generic;
using System;
using UnityEngine;

[Serializable]
public class Stat
{
    [SerializeField]
    private BarScript bar;

    [SerializeField]
    private float maxVal;

    [SerializeField]
    private float currentVal;

    public float CurrentVal
    {
        get
        {
            return currentVal;
        }

        set
        {

            this.currentVal = value;
            Bar.Value = currentVal;
        }
    }

    public float MaxVal
    {
        get
        {
            return maxVal;
        }

        set
        {
            this.maxVal = value;
            Bar.MaxValue = maxVal;
        }
    }

    public BarScript Bar
    {
        get
        {
            return bar;
        }
    }

    public void Initialize()
    {
        this.MaxVal = maxVal;
        this.CurrentVal = currentVal;
    }
}
programacion y diseño orientado a objetos :twisted:
black

User avatar
xacarana
Site Admin
Posts: 1170
Joined: Fri Jan 15, 2016 6:13 pm

Re: Hitler - RusiaDefense

Post by xacarana » Thu May 02, 2019 12:21 pm

Image

Se debe publicar evidencias del avance, además la publicación debe ser en la feccha de la clase.
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Thu May 02, 2019 12:36 pm

diagrama de clases
Image

clases(a excepcon de las del algoritmo AStar)
Image
programacion y diseño orientado a objetos :twisted:
black

User avatar
Vidal18
Posts: 18
Joined: Tue Jan 22, 2019 12:12 pm

Re: Hitler - RusiaDefense

Post by Vidal18 » Tue May 07, 2019 12:21 pm

¿que se ha hecho?
se realizo el sistema visual de las barras de vida y el codigo base de esta... se reemplazo; a lo largo del dia acabare para que el personaje reciba daño y muera
¿que se va a hacer?
luego del sistema de vida, comenzare con la venta de torres y le asignare daños diferentes a cada una.
agregare enemigos y se realizaran sprites propios
¿algun problema?
ninguno

Code: Select all

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private float startingHealth;
    [SerializeField] private float currentHealth;
    [SerializeField] private float defencePercent;

    public float CurrentHealth
    {
        get { return currentHealth; }
        set { currentHealth = value - defencePercent; }
    }

    private void Awake()
    {
        currentHealth = startingHealth;
    }

    private void Update()
    {
        HealthBarUpdater();
    }

    private void HealthBarUpdater()
    {
        Transform barTransform = transform.Find("HealthBar").Find("Bar").transform;
        barTransform.localScale = new Vector3(CurrentHealth / 100, 1f);
    }
}
Image
programacion y diseño orientado a objetos :twisted:
black

User avatar
xacarana
Site Admin
Posts: 1170
Joined: Fri Jan 15, 2016 6:13 pm

Re: Hitler - RusiaDefense

Post by xacarana » Thu May 09, 2019 12:33 pm

Image

¡Bien!
Andrés Bedoya Tobón
Profesor
"I only smile in the dark, I only smile when it's complicated" Raybiez

Post Reply