Сайт посвящен игре Stranded
Суббота, 21.10.2017
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Многопользовательская онлайн игра 'Герои битвы'
Страница 1 из 11
Модератор форума: order 
Форум » Stranded+Unity3d » Портирование Stranded+Unity3d » Разбор скриптов (разбираем, учимся, ищем новые)
Разбор скриптов
orderДата: Понедельник, 15.03.2010, 11:44 | Сообщение # 1
Подполковник
Группа: Модератор Stranded+Unity3d
Сообщений: 147
Репутация: 7
Статус: Offline
Здесь постим, готовые скрипты с описанием и комментариями на русском.
разбираем новые.

Начну с самого простого, с первого что я сделал.

Стрела

Code
var timeOut = 10.0; // время жизни стрелы

function Start () {
rigidbody.centerOfMass = Vector3 (0, 0, 5); // пытался сдвинуть массу по оси Z  позже нашел другое решение,
}

function OnCollisionEnter (collision : Collision) { // отслеживает колизии (столкновения)

transform.parent = collision.transform; // при столкновении стрела становится дочерней объекту столкновения (втыкается)
rigidbody.isKinematic = true; // включается кинематика, отключение физики стрелы.
}

@script RequireComponent (Rigidbody) // добавляет компонент ригбоди(физика) по идее не обязательно, можно в ручную поставить

Лук

Code

       
var arrow : Rigidbody;  //сюда помещают физическое тело стрелу
var initialSpeed = 20.0; //начальная скорость
var reloadTime = 0.5; // время перезарядки
var ammoCount = 20; // счетчик стрел
private var lastShot = -10.0; // время последнего выстрела

function Fire () {
    // время до следующего выстрела и счетчик выстрелов(Time.time - время с запуска)
    if ( Time.time > reloadTime + lastShot && ammoCount > 0) {

     // создание новой стрелы в точке объекта лука.
     var instantiatedProjectile : Rigidbody = Instantiate (arrow, transform.position, transform.rotation);
         
     // придание скорости стреле по оси Z .
     instantiatedProjectile.velocity = transform.TransformDirection(Vector3 (0, 0, initialSpeed));

     // игнорирование столкновения с игроком
     Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider);

     //присваивание id стреле, планирую для записи.
     instantiatedProjectile.name = "arrow" + instantiatedProjectile.GetInstanceID();
        
     lastShot = Time.time; // время последнего выстрела
     ammoCount--; // уменьшение стрел
    }
}
 
DreamingWolfДата: Понедельник, 15.03.2010, 14:44 | Сообщение # 2
Лейтенант
Группа: Пользователи
Сообщений: 58
Репутация: 2
Статус: Offline
Ну можно и так. Вот мой вариант комментариев, если понравится можно использовать этот вариант вместо того:
Code

var arrow : Rigidbody;  //Дает возможность задать физическое тело, выполняющее роль снаряда (стандартное значение "не задано")
var initialSpeed = 20.0; //Дает возможность задать начальную скорость полета снаряда (стандартное значение 20)
var reloadTime = 0.5; //Дает возможность задать минимальное время между выстрелами (стандартное значение 0.5 секунд)
var ammoCount = 20; //Дает возможность задать начальное количество зарядов (стандартное значение 20)
private var lastShot = -10.0; //Внутренняя переменная, используемая в скрипте для сохранения времени последнего выстрела

function Fire () //Задает функции имя Fire, для того чтобы функция выполнилась ее нужно будет вызвать в другой функции, в этом или в любом другом скрипте
{
    if (Time.time > reloadTime + lastShot && ammoCount > 0) //Эта часть скрипта проверяет прошло ли необходимое время между выстрелами с момента последнего вытрела, если "нет" скрипт не выполняется, если "да" скрипт выполняется
   {   
    var instantiatedProjectile : Rigidbody = Instantiate (arrow, transform.position, transform.rotation); //Задает значение внутренней переменной instantiatedProjectile, в качестве значения используется клон снаряда, созданный в том месте где располагается объект, которому присвоен этот скрипт, и с тем же углом как у этого объекта
    instantiatedProjectile.velocity = transform.TransformDirection(Vector3 (0, 0, initialSpeed)); //Придание скорости снаряду по оси Z
    Physics.IgnoreCollision(instantiatedProjectile.collider, transform.root.collider); //Игнорирование снарядом колайдера объекта, являющегося корневым по отношению к объекту, в котором находится скрипт
    instantiatedProjectile.name = "arrow" + instantiatedProjectile.GetInstanceID(); //Присваивание id стреле  (я этим не пользовался действие незнаю)
    lastShot = Time.time; //Задает значение переменной lastShot, в качестве значения используется время использования скрипта
    ammoCount--; //Вычитает из значения переменной ammoCount единицу
   }   
}

Этот скрипт может быть использован и в таком виде, но лучше убрать все комментарии (они начинаются на //)




Сообщение отредактировал DreamingWolf - Понедельник, 15.03.2010, 14:47
 
DreamingWolfДата: Понедельник, 15.03.2010, 15:46 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 58
Репутация: 2
Статус: Offline
Справочник скриптописца:

Самые азы

Типы игровых объектов:

Операции с переменными:

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




Сообщение отредактировал DreamingWolf - Вторник, 16.03.2010, 17:28
 
orderДата: Вторник, 16.03.2010, 06:48 | Сообщение # 4
Подполковник
Группа: Модератор Stranded+Unity3d
Сообщений: 147
Репутация: 7
Статус: Offline
С утра сделал скрипт use.js из MachineGun.js
и скрипт used.js из DamageReceiver.js
Повесил на кнопку Е , оставил дамаг, может пригодиться для отладки.
убрал логику стрельбы, и спецэффекты.
Скрипт не доделан, но основную мысль передает.

Работает так: при нажатии на Е посылается луч вперед, при пересечении им какого либо ригибоди ему посылается сообщение use. Если объект имеет скрипт used. то в нем срабатывает функция use.

use

Code
var range = 100.0; //дальность
var force = 10.0; // сила
var damage = 5.0; // повреждения
     
function Update (){
   if (Input.GetButtonDown("E")) //если нажата Е
    {
     Debug.Log("press E");  //сообщение в лог, для отладки
     var direction = transform.TransformDirection(Vector3.forward); //направление = направляет луч вперед
     var hit : RaycastHit;// удар луча <img src="http://s20.ucoz.net/sm/23/smile.gif" border="0" align="absmiddle" alt="smile"> не нужная строчка, но пока пусть будет
     
     // проверка пересечания
     if (Physics.Raycast (transform.position, direction, hit, range)) {
      // Прилодение силы к телу, тоже не обязательная , но может пригодиться.
      if (hit.rigidbody)
      hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
      //  посылается сообщение обьекту   
      hit.collider.SendMessageUpwards("use", damage, SendMessageOptions.DontRequireReceiver);
     }
    }
}

used

Code

var deadReplacement : Rigidbody;

function use () { // собственно сюда писать алгоритм , что должно происходить с объектом при его использовании
   Debug.Log("used");   
   DelayedDetonate ();
}

function DelayedDetonate () {
   BroadcastMessage ("Detonate");
}
//это не обязательно, это я для перезарядки требуше поставил. Подменяет живой объект на мертвый.
function Detonate () {
   Destroy(gameObject);
   if (deadReplacement) {
    var dead : Rigidbody = Instantiate(deadReplacement, transform.position, transform.rotation);
    dead.rigidbody.velocity = rigidbody.velocity;
    dead.angularVelocity = rigidbody.angularVelocity;
   }
}

// We require the barrel to be a rigidbody, so that it can do nice physics
@script RequireComponent (Rigidbody)
 
DreamingWolfДата: Среда, 17.03.2010, 20:28 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 58
Репутация: 2
Статус: Offline
Почему я не могу отредактировать свое сообщение? Хмм может установлены временные рамки, в пределах которых пользователь может отредактировать свое сообщение? Вобщем хотел дополнить "справочник скриптописца" а кнопки "редактировать" нету =(



Сообщение отредактировал DreamingWolf - Среда, 17.03.2010, 20:31
 
orderДата: Четверг, 18.03.2010, 03:55 | Сообщение # 6
Подполковник
Группа: Модератор Stranded+Unity3d
Сообщений: 147
Репутация: 7
Статус: Offline
DreamingWolf, видимо есть .. сделай новое сообщение , а то я удалю.
 
DreamingWolfДата: Воскресенье, 21.03.2010, 23:40 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 58
Репутация: 2
Статус: Offline
Ну дак мне все время новые сообщения делать потом? =) надо этот вопрос как то решить

Добавлено (22.03.2010, 03:40)
---------------------------------------------
Хмм... ладно, после того как завершу работу над поставленной целью, создам у себя на интернет-ресурсе руководство по скриптам (там хоть свободы действий побольше будет)




Сообщение отредактировал DreamingWolf - Воскресенье, 21.03.2010, 23:41
 
devi409Дата: Среда, 24.03.2010, 10:12 | Сообщение # 8
Царь
Группа: Администраторы
Сообщений: 633
Репутация: 45
Статус: Offline
Почему не можешь? свои сообщения можно редактировать чужие нет.
 
devi409Дата: Среда, 24.03.2010, 10:14 | Сообщение # 9
Царь
Группа: Администраторы
Сообщений: 633
Репутация: 45
Статус: Offline
Только что проверил. Пользователям можно редактировать свои сообщения.
 
orderДата: Среда, 24.03.2010, 11:05 | Сообщение # 10
Подполковник
Группа: Модератор Stranded+Unity3d
Сообщений: 147
Репутация: 7
Статус: Offline
там таймаут скорее всего стоит, после которого нельзя редактировать.
надо увеличить время просто.
 
witeДата: Среда, 11.07.2012, 12:32 | Сообщение # 11
Рядовой
Группа: Пользователи
Сообщений: 1
Репутация: 0
Статус: Offline
помогите плиз со строительством,скрипом или скажите в какую сторону капать.
 
Форум » Stranded+Unity3d » Портирование Stranded+Unity3d » Разбор скриптов (разбираем, учимся, ищем новые)
Страница 1 из 11
Поиск:

Copyright MyCorp © 2017