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

Так же, на сцене, присутствует персонаж над которым мы и будем немного издеваться. Создадим скрипт в котором пропишем уровень здоровья, энергии и времени, и назовем его 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.

Теперь поиграемся немного с нашими «бафами». Создадим на каждом предмете 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);
}
}
Поместим этот скрипт на отдельный компонент (пустышку) на сцене и укажем точку откуда будут начинать появляться предметы и диапазон (в пределах какой зоны будут они появляться), так же укажем наши предметы.

Дальше укажем для каждого предмета, что они будут пополнять при взаимодействии персонажа с ними. Для каждого из них напишем скрипт.
Для предмета который пополняет здоровье скрипт 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);
}
}
}

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








