Unity 5. Полезные предметы

Unity 5. Полезные предметы

Создание полезных предметов для персонажа

В любой игре присутствую полезные предметы для персонажей или групп, например это всевозможные аптечки, увеличивающие здоровье персонажа, различные вспомогательные эффекты, типа увеличения силы, скорости или ловкости ит.д. Такие же предметы мы и попробуем создать в нашем примере.

В blender’e на скорую руку я «смастерил» несколько предметов, перенес их в Unity и немного «разукрасил». Предметы который будет увеличивать энергию, здоровье и прибавление времени.

predmeti

Скачать можно здесь

Так же, на сцене, присутствует персонаж над которым мы и будем немного издеваться. Создадим скрипт в котором пропишем уровень здоровья, энергии и времени, и назовем его PersState

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

public class PersState : MonoBehaviour {

    public int PlayerZdorobe = 100;
    public float PlayerEnergi = 100 ;
    public float PlayerVrema = 900;
    public Slider Energi;
    public Slider Zdorove;
    public Text Vrema;
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        PersVrema();
        PersEnergi();
    }

    public void PersZdorov() {
        if (PlayerZdorobe < 0) { PlayerZdorobe = 0; } if (PlayerZdorobe > 100)
        {
            PlayerZdorobe = 100;
        }
        Zdorove.value = PlayerZdorobe;
    }

    public void PersEnergi() {
        //данная функция будет работать только у меня, вы же на уменьшения энергии можете взять что-то свое или брать эту функцию
        if (this.gameObject.GetComponent().__push == true)
        {
            PlayerEnergi = PlayerEnergi - Time.deltaTime;
            
        }
        else {
            PlayerEnergi = PlayerEnergi + Time.deltaTime/2;
            
        }
        if (PlayerEnergi < 0) { PlayerEnergi = 0; } if (PlayerEnergi > 100)
        {
            PlayerEnergi = 100;
        }
        Energi.value = PlayerEnergi;
    }
    public void PersVrema() {
        PlayerVrema = PlayerVrema - Time.deltaTime;
        Vrema.text = "" + (int)PlayerVrema;
    }
}

Разместим этот скрипт на персонаже и добавим компонент Canvas на сцену где будут находится 2 слайдера (здоровье и энергия) и компонент Text, где будет отображаться время. Укажем эти компоненты в скрипте PersState.

pers slider

Теперь поиграемся немного с нашими «бафами». Создадим на каждом предмете box collaider и поставим галочку isTrigger, и сохраним каждый предмет в Префаб. Далее создадим скрипт, который будет раскидывать наши предметы в рандомном месте. Назовем его PredmetRandomStart

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

public class PredmetRandomStart : MonoBehaviour {

    public Vector3 center; 
    public Vector3 size; 
    public GameObject zdorove; 
    public GameObject energi;
    public GameObject vrema;
    public float timerzdorove;
    public float timerenergi;
    public float timervrema;
    public bool timer1 ;
    public bool timer2 ;
    public bool timer3 ;

    void Start()
    {
        timerzdorove = Random.Range(10, 50);
        timerenergi = Random.Range(10, 50);
        timervrema = Random.Range(10, 50);
    }
    private void Update()
    {
        SpawnZdorove();
        SpawnEnergi();
        SpawnVrema();
        
    }

    public void SpawnZdorove() {
        if (timer1)
        {
            timerzdorove -= Time.deltaTime;
            if (timerzdorove <= 0)
            {
                Vector3 pos = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), Random.Range(-size.y / 2, size.y / 2), Random.Range(-size.z / 2, size.z / 2));
            Instantiate(zdorove, pos, Quaternion.Euler(0f, 0f, -90f));
                timerzdorove = Random.Range(10, 50);
                timer1 = false;
            }
        }
    }

    public void SpawnEnergi()
    {
        if (timer2)
        {
            timerenergi -= Time.deltaTime;
            if (timerenergi <= 0)
            {
                Vector3 pos2 = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), Random.Range(-size.y / 2, size.y / 2), Random.Range(-size.z / 2, size.z / 2));
            Instantiate(energi, pos2, Quaternion.Euler(0f, 0f, -90f));
                timerenergi = Random.Range(10, 50);
                timer2 = false;
            }
        }
    }

    public void SpawnVrema()
    {
        if (timer3)
        {
            timervrema -= Time.deltaTime;
            if (timervrema <= 0)
            {
                Vector3 pos3 = center + new Vector3(Random.Range(-size.x / 2, size.x / 2), Random.Range(-size.y / 2, size.y / 2), Random.Range(-size.z / 2, size.z / 2));
            Instantiate(vrema, pos3, Quaternion.Euler(0f, 0f, -90f));
                timervrema = Random.Range(10, 50);
                timer3 = false;
            }
        }
    }


    void OnDrawGizmosSelectes()
    {
        Gizmos.color = new Color(1, 0, 0, 0.5f);
        Gizmos.DrawCube(transform.localPosition + center, size);
    }
}

Поместим этот скрипт на отдельный компонент (пустышку) на сцене и укажем точку откуда будут начинать появляться  предметы и диапазон (в пределах какой зоны будут они появляться), так же укажем наши предметы.

randompredmet

Дальше укажем для каждого предмета, что они будут пополнять при взаимодействии персонажа с ними. Для каждого из них напишем скрипт.

Для предмета который пополняет здоровье скрипт HealthBaf

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

public class HealthBaf : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    public void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "pers3") {
            other.GetComponent().PlayerZdorobe = other.GetComponent().PlayerZdorobe + Random.Range(10, 30);
            GameObject.FindGameObjectWithTag("Scene").GetComponent().timer1 = true;
            Destroy(gameObject);
        }
    }
}

Для предмета который пополняет энергию скрипт Energibaf

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

public class Energibaf : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

    public void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "pers3")
        {
            other.GetComponent().PlayerEnergi = other.GetComponent().PlayerEnergi + Random.Range(10, 30);
            GameObject.FindGameObjectWithTag("Scene").GetComponent().timer2 = true;
            Destroy(gameObject);
        }
    }
}

Для предмета который пополняет время скрипт VremaBaf

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

public class VremaBaf : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    public void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.name == "pers3")
        {
            other.GetComponent().PlayerVrema = other.GetComponent().PlayerVrema + Random.Range(10, 30);
            GameObject.FindGameObjectWithTag("Scene").GetComponent().timer3 = true;
            Destroy(gameObject);
        }
    }
}

baf

Поместим скрипты на предметы и не забываем все сохранять. Теперь, если у вас есть желание можете проверить (запустить игру). Если все настроено верно, персонаж со скриптом отвечающий за здоровье, энергию и время, пустышка со скриптом отвечающий за размещение предметов на сцене и сами предметы со скриптами на увеличение значений персонажа, то все должно сработать. На сцене через какое-то время будут появляться предметы, которые при столкновении с персонажем будут поднимать его статистики и исчезать после этого.

В моем случаем, у меня есть заготовка, где персонаж должен толкать некие предметы в определенную точку, естественно будет тратится энергия, здоровье и тикать время, на видео вы можете все посмотреть.

P.S. Если у вас возникнут вопросы по данной теме, можете задавать их в комментариях или в группе ВК. Удачных проектов!

На главную


Оставить Комментарий