Рубка деревьев (обновляемое) - Форум - Все для Unity3d

Все для Unity3d> Рубка деревьев (обновляемое) - Форум>
Страница 1 из 212»
Форум » Unity » Уроки » Рубка деревьев (обновляемое) (Покажу как осуществить рубку дерева с реалистичным падением.)
Рубка деревьев (обновляемое)
maxim738Дата: Вторник, 17.06.2014, 12:53 | Сообщение # 1
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Часть текста перенёс с другой темы , где я это объяснял . Я решил не остонавливаться на достигнутом и развивать идею.Можно сделать двумя путями - через триггеры или через raycast

Первый способ:

Создаём простую сцену делаем террейн , освещение и т.д . Берём модель дерева , приделываем  капсульный колайдер по форме ствола и ещё один боксовый поперёк на листву(чтобы после падения оно не катилось вдоль капсульного колайдера)  , добавляем Rigidbody и делаем true параметр IsKinematic  , это значит что на дерево не влияет физика и когда надо мы его отключаем , чтобы соответственно физика появилась.Добавляем в префаб готовое дерево


.Создал скрипт js:
Код
function OnTriggerStay (other : Collider) {      // фунция работы с триггерами
if(other.gameObject.name=="Palm"){   //проверяем наличие в триггере объекта с иминем "Palm"
if(Input.GetMouseButtonDown(0)){   //при нажатии на ЛКМ..
other.rigidbody.isKinematic = false;    //отключаем параметр isKinematic
}
}
}


Ложим скрипт на камеру стандартного fist person controller'а и приделываем на неё (камеру) колайдер-зону где игрок как-бы размахивает топором , ставим параметр IsTrigger и всё, когда персонаж подходит к дереву и нажимает левую кнопку мыши , то у дерева отключается игнор физики , а так как ствол состоит из капсулы , то оно непременно упадёт(надо малейшая неровность) , если хотите можете к дереву силу приложить AddForce , но оно и так падает вполне естественно , я поставил на него массу в 5 , всё очень просто. Забыл добавить что надо указать имя дереву "Palm" если хотите использовать мой код , так же можете работать через тег , для этого вместо  if(other.gameObject.name=="Palm"){  надо  if(other.gameObject.tag=="Palm"){

Второй способ(На той же сцене):
Создаём скрипт C# :
Код
using UnityEngine;
using System.Collections;

public class Name : MonoBehaviour {

             void Start () {           
                Screen.showCursor = false; //скрываем курсор(необязательно)
             }           

             void Update () {           
                Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2,Screen.height/2,0)); //проводим луч от
           // камеры по вектору центра экрана
                RaycastHit hit; //определяем луч в переменную
                          
                if(Physics.Raycast(ray,out hit,5f) && hit.collider.tag == "palm")  // если луч длиной 5 юнов упёрся в колайдер с // тегом "palm" то
                {             
                   if(Input.GetMouseButtonUp(0)&& hit.collider.rigidbody.isKinematic == true ) // если мы нажимаем ЛКМ и на           
// пальме включен режим игнора физики( isKinematic) то
                   {           
                      hit.collider.rigidbody.isKinematic = false; // включаем взаимодействие с физикой
                      hit.collider.rigidbody.AddRelativeForce(0, 0, 5); // применяем силу к пальме по лок. координатам , чтобы            
// охотнее падала))           
                   }
                }
             }
}


перетаскиваем скрипт на персонажа (не забудте убрать триггер , который описан в первом способе  ,а то работать не будет).Ставим массу пальме 5 и теперь она будет падать "полюбому" от одного удара.
Вскоре я обновлю тему , сделаю счётчик ударов для каждой пальмы (чтобы не ломалась после одного удара )
сделаю деревьям пеньки , которые будут оставаться после срубки и мини инвентарь , который показывает число нарубленных брёвен (начисляться будут после ударов уже поваленного дерева и после нного кол-ва ударов дерево будет исчезать), реализация самого топора со звуками при ударе о дерево и анимацией.Вот такой несложный урок получился , спасибо за то что прочли , оставляйте отзывы и пишите чего бы вы хотели увидеть . biggrin

Добавлено (17.06.2014, 12:25)
---------------------------------------------
Продолжаем ! Сейчас мы реализуем накопительную систему для каждого дерева  ,чтобы только после определённого кол-ва ударов оно упало.Для этого откроем наш прошлый скрипт с raycast'ами и кое что поменяем :

Код
using UnityEngine;
using System.Collections;

public class AttackeWood : MonoBehaviour {
        // Use this for initialization      
        void Start () {      
           Screen.showCursor = false;      
        }      
             
        // Update is called once per frame      
        void Update () {      
           Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2,Screen.height/2,0));      
           RaycastHit hit;      
                
           if(Physics.Raycast(ray,out hit,5f) && hit.collider.tag == "palm")      
           {        
              var to = hit.collider.GetComponent<stat>(); //вводим в переменную компонент stat  ,который мы сейчас напишем
              if(Input.GetMouseButtonUp(0)&& to.poval == false ) //если мы нажимаем на ЛКМ и дерево ещё не повалено     
              {      
                 to.volume -= 1;//отнимаем в будующем скрипте переменную на 1
              }
           }
        }
}


Так , со старым скриптом мы разобрались , теперь создадим новый C# и назовём его stat:

Код
using UnityEngine;
using System.Collections;

public class stat : MonoBehaviour {
        public int volume = 5; //назначаем кол-во ударов , необходимое для срубки
        public bool poval = false;  //данное состояние дерева , false -не повалено , true - повалено
// далее , думаю всё понятно
        void Update () {
        if (volume == 0) {
              poval = true;
              rigidbody.isKinematic = false;      
              rigidbody.AddRelativeForce(0, 0, 5);
           }
        }
}


Скрипт кидаем на пальму и дело сделано , после только 5 ударов дерево упадёт, далее займёмся системой пауз между ударов , чтобы их(удары) можно было наносить только спустя пару секунд.Оценивайте happy

Добавлено (17.06.2014, 12:46)
---------------------------------------------
Привет! Реализуем паузы между ударами.
Возьмём всё тот же скрипт AttackeWood и встроем в него таймер : 
Код
using UnityEngine;
using System.Collections;

public class AttackeWood : MonoBehaviour {
       // Use this for initialization     
       public float Timer = 1.7f; // кол-во сек между ударами
       private float TimerDown;
       public bool atk; //разрешение на удар
       void Start () {     
          Screen.showCursor = false;     
          TimerDown = Timer; //Задаем временной переменной значение которое нужно отсчитать
          atk = true; //С начала игры атака доступна
       }     
           
       // Update is called once per frame     
       void Update () {     
                Ray ray = Camera.main.ScreenPointToRay (new Vector3 (Screen.width / 2, Screen.height / 2, 0));     
                RaycastHit hit;     
              
                if (Physics.Raycast (ray, out hit, 5f) && hit.collider.tag == "palm") {       
                      var to = hit.collider.GetComponent<stat> ();
                      if (Input.GetMouseButtonUp (0) && to.poval == false && atk == true) { // кроме всего прочего если атака доступна
                            atk = false; // запрещаем атаку
                            to.volume -= 1;      
                      }
                }
                if (atk == false) { // если атака заблокировалась то     
                      if (TimerDown > 0) { // включаем таймер на 1.7 сек.
                            TimerDown -= Time.deltaTime;
                            if (TimerDown < 0) {
                       TimerDown = 0;
                       if (TimerDown == 0) {
                       atk = true; // после окончания включаем возможность атаки     
                       TimerDown = Timer; // приводим таймер в дефолтное состояние     
                       }
                            }
                      }
                }
          }
}

Всё! теперь мы можем "рубить" дерево не чаще чем каждую 1.7 секунды . Далее займёмся начислением брёвен после срубки дерева .

Добавлено (17.06.2014, 13:34)
---------------------------------------------
Продолжаем!Займёмся рубкой уже поваленного дерева , начисления брёвен , а так же вывод данных на экран, поехали.
Дополним скрипт stat :

Код
using UnityEngine;
using System.Collections;

public class stat : MonoBehaviour {
       public int volume = 5;
       public int volumeBr = 5; // кол-во брёвен , содержащихся в дереве
       public bool poval = false;

       void Update () {
       if (volume == 0) {
             poval = true;
             rigidbody.isKinematic = false;
             rigidbody.AddRelativeForce(0, 0, 5);

          }
          if (volumeBr == 0) { // если брёвна закончились , дерево уничтожается      
                      DestroyObject (this.gameObject);
                }
       }
}


Далее изменим AttackeWood :

Код
using UnityEngine;
using System.Collections;

public class AttackeWood : MonoBehaviour {
       // Use this for initialization     
       public float Timer = 1.7f;
       public int brevna = 0; //кол-во брёвен у нас     
       public float TimerDown; //сделал публичной для вывода на экран
       public bool atk;
       public int xp; // переменная для вывода на экран

       void Start () {     
          Screen.showCursor = false;     
          TimerDown = Timer;
          atk = true;
       }     
           
       // Update is called once per frame     
       void Update () {     
                Ray ray = Camera.main.ScreenPointToRay (new Vector3 (Screen.width / 2, Screen.height / 2, 0));     
                RaycastHit hit;     
              
                if (Physics.Raycast (ray, out hit, 5f) && hit.collider.tag == "palm") {       
                      var to = hit.collider.GetComponent<stat> ();
                          xp = to.volume; // вводим количество оставшихся ударов в переменную xp     
                      if (Input.GetMouseButtonUp (0) && to.poval == false && atk == true) {     
                            atk = false;
                            to.volume -= 1;
             }
                         if (Input.GetMouseButtonUp (0) && to.poval == true && atk == true) { // если дерево повалено и мы
//нажали ЛКМ и атака разрешена, то
                     atk = false;
                     to.volumeBr -= 1; // отбираем у дерева одно бревно     
                     brevna += 1; // и зачисляем нам
                      }
                }
                if (atk == false) {
                      if (TimerDown > 0) {
                            TimerDown -= Time.deltaTime;
                            if (TimerDown < 0) {
                       TimerDown = 0;
                       if (TimerDown == 0) {
                       atk = true;
                       TimerDown = Timer;
                       }
                            }
                      }
                }
          }
       void OnGUI () {  // Выводим данные на экран     
          GUI.Box(new Rect(100,20,200,40), "Кол-во брёвен : " + brevna);
          GUI.Box(new Rect(100,70,200,40), "Перезарядка : " + TimerDown);
          GUI.Box(new Rect(310,20,200,40), "Жизней у дерева : " + xp);

          }

}


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

Добавлено (17.06.2014, 13:53)
---------------------------------------------
https://yadi.sk/d/PZQLR0RnZ2xVg - исходники


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

Сообщение отредактировал maxim738 - Суббота, 30.08.2014, 13:01
 
devpilgrimДата: Вторник, 17.06.2014, 15:23 | Сообщение # 2
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
Имхо, в качестве коллайдера наверное лучше использовать многогранный усеченный конус (широкой частью имитирующий широкую часть кроны), а то дерево ведет себя как кусок забора... При валке оно после падения может проворачиваться и даже катится...

Готов работать за деньги, или за очень большие деньги.
 
maxim738Дата: Среда, 18.06.2014, 09:37 | Сообщение # 3
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
devpilgrim, согласен , я сам для ствола выбрал другой коллайдер , т.к капсульный не очень годится .

Добавлено (18.06.2014, 10:37)
---------------------------------------------
devpilgrim, у меня тут назрел вопрос . У меня есть моделька топора , я сделал в unity анимацию для него , всё работает  и анимация получается качественная. Так , о чём я?) Есть урок по меканим   

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


Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
devpilgrimДата: Среда, 18.06.2014, 11:22 | Сообщение # 4
Начинающий писатель
Группа: Проверенные
Сообщений: 196
Статус: Offline
maxim738, Я в меканим как "Дуб дерево хвойное".
На самом деле считаю, что обычной анимации за глаза для любой игры.


Готов работать за деньги, или за очень большие деньги.
 
Haker_adminДата: Пятница, 20.06.2014, 22:17 | Сообщение # 5
Новый писатель
Группа: Пользователи
Сообщений: 1
Статус: Offline
В самом первом скрипте ошибка. Помоги! ошибка function ..
Или просто дай свой проект я посмотрю и сверю с твоим! ок.
 
energystarДата: Среда, 09.07.2014, 19:52 | Сообщение # 6
Новый писатель
Группа: Пользователи
Сообщений: 13
Статус: Offline
Спс, статья как раз подходит для моей игры. Скачал модель топора, отредактировал в блендере, приделал анимацию получилось реально круто.

p.s може кому пригодится http://tf3dm.com/3d-model/axe-11824.html (модель топорика)
 
maxim738Дата: Понедельник, 14.07.2014, 19:54 | Сообщение # 7
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Цитата energystar ()
Спс, статья как раз подходит для моей игры. Скачал модель топора, отредактировал в блендере, приделал анимацию получилось реально круто. p.s може кому пригодится http://tf3dm.com/3d-model/axe-11824.html (модель топорика)
Спасибо,рад помочь , вообщем-то я тоже делаю игру и там это есть(рубка) , и топоры , и кирки , и крафты ,  урок я наверное дополню по анимации топора


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

Сообщение отредактировал maxim738 - Понедельник, 14.07.2014, 19:58
 
SaintsBROДата: Пятница, 25.07.2014, 22:15 | Сообщение # 8
Новый писатель
Группа: Пользователи
Сообщений: 1
Статус: Offline
maxim738, помоги, а? а то я видемо туповат)) не получается!! а срочно то надо!!!! помоги!!!! ВОТ МОЙ СКАЙП - ssaintsbro
 
bod9n1Дата: Воскресенье, 03.08.2014, 20:56 | Сообщение # 9
Новый писатель
Группа: Пользователи
Сообщений: 13
Статус: Offline
Цитата maxim738 ()
https://yadi.sk/d/0h0iBqQaTiFMq - вот демка
перезалей)


Кто наговнокодил мне под дверь?
 
maxim738Дата: Воскресенье, 03.08.2014, 22:26 | Сообщение # 10
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
ССылку на демку утерял  ,зато есть кое какой билд моей игры , там можно скрафтить из одной палки и одного камня топор , а им рубить деревья , не судите сторого (никак вообще) билд вообщем не для широкой публики  ,но выложу)) https://yadi.sk/d/S1cmOGQlYwpMJ

Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
bod9n1Дата: Понедельник, 04.08.2014, 11:34 | Сообщение # 11
Новый писатель
Группа: Пользователи
Сообщений: 13
Статус: Offline
Цитата maxim738 ()
ССылку на демку утерял  ,зато есть кое какой билд моей игры , там можно скрафтить из одной палки и одного камня топор , а им рубить деревья , не судите сторого (никак вообще) билд вообщем не для широкой публики  ,но выложу)) https://yadi.sk/d/S1cmOGQlYwpMJ
прикольно


Кто наговнокодил мне под дверь?

Сообщение отредактировал bod9n1 - Понедельник, 04.08.2014, 11:42
 
Лектор777Дата: Понедельник, 04.08.2014, 11:41 | Сообщение # 12
Новый писатель
Группа: Пользователи
Сообщений: 8
Статус: Offline
Очень полезные уроки. Особенно для так начинающих,как я. В скриптах полный ноль. Поэтому,буду учиться по твоим урокам. Но вместе с этим появились вопросы.
1)Как реализовать : Пеньки. Как сделать чтобы оставались пеньки после сруба.
2) Как сделать,чтобы после последнего удара,дерево валилось сразу,а не уходила частично под террейн (сразу ваилось - не в смысле скорости)
 
maxim738Дата: Понедельник, 04.08.2014, 12:02 | Сообщение # 13
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Цитата Лектор777 ()
1)Как реализовать : Пеньки. Как сделать чтобы оставались пеньки после сруба.
Способов несколько , проект с уроком утерял , как восстановлю , продолжу писать.
Цитата Лектор777 ()
Как сделать,чтобы после последнего удара,дерево валилось сразу,а не уходила частично под террейн (сразу валилось - не в смысле скорости)
надо чтобы коллайдер дерева не проваливался под террейн и не висел высоко , также советую увеличить массу (соответственно увеличить силу).В последующих уроках все эти аспекты я расскажу.


Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
Лектор777Дата: Понедельник, 04.08.2014, 15:17 | Сообщение # 14
Новый писатель
Группа: Пользователи
Сообщений: 8
Статус: Offline
maxim738, спасибо. А есть ли у вас модель и анимация топора? Ну,как в примере,который с диска скачивать надо. GG называется. Хотелось бы узнать,Где вы создали анимацию. Если не трудно. Может,благодаря вашим урокам смогу сделать игру похожую на The Forest
 
maxim738Дата: Понедельник, 04.08.2014, 21:34 | Сообщение # 15
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Цитата Лектор777 ()
А есть ли у вас модель и анимация топора? Ну,как в примере,который с диска скачивать надо. GG называется. Хотелось бы узнать,Где вы создали анимацию. Если не трудно. Может,благодаря вашим урокам смогу сделать игру похожую на The Forest
Анимацию делал прямо в юнити  ,очень удобно  ,стандартных решений хватает .Сама модель - https://yadi.sk/d/TB4D5-HdZ5kvQ


Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
Форум » Unity » Уроки » Рубка деревьев (обновляемое) (Покажу как осуществить рубку дерева с реалистичным падением.)
Страница 1 из 212»
Поиск:
Свернуть
Развернуть
Необходима авторизация
0
ТОП-5 САЙТА
НОВЫЕ ИГРЫ
ГОРЯЧИЕ ТЕМЫ
СЛУЧАЙНЫЕ ФАЙЛЫ