Прорисовка элементов GUI

Программирование на Юнити.

Прорисовка элементов GUI

Сообщение greabock 05 мар 2012, 15:13

Здравствуйте! Как и большинство присутствующих, я еще только начал осваивать Unity. И сразу же столкнулся с проблемой. Вернее не проблемой, а тем фактом, что никогда раньше программированием не занимался. Однако, руки вроде бы прямые и голова варит. В общем надеюсь на ваше сочувствие :) .

А теперь о проблеме:
Хотелось бы знать: как сделать так, что бы некоторые элементы интерфейса рисовались каждый кадр. Обрисую саму проблему. Мне необходимо что бы индикатор в приведенном ниже коде обновлялся каждый кадр (Кому лень читать весь код - смотрим в самый низ).
Синтаксис:
Используется javascript

public var bulletImpulse : int = 400;   //Коофицент силы выстрела
public var maxPowerShotRate : int = 10; //Максимальный прирост от удержания
public var minPowerShotRate : int = 1;  //Минимальный прирост от удержания
public var shootSpeed : int = 1;        //Задержка перед следующим выстрелом

private var powerShoot : float;    //Итоговая сила выстрела
private var lastShootTime : float; //Время последнего выстрела
private var shootMode : boolean;   //Режим удержания, если он == тру, значит кнопка стрельбы удерживается.  
private var startShoot : float;    //Время начала удержания. Используется для рассчета силы выстрела исходя из времени удержания.
private var endShoot : float;      //Время окончания удержания. Тоже, что и там ^^^



private var indicatorPowerShoot : float;  //Переменная определяющая длинну линии, указывающей на то, какова будет сила встрелаа если прекратить удержание в данный момент.

public var bullet : GameObject; //Непосредственно снаряд, которым мы стреляем.



function Start() {

//Задаем изначальное значение некоторых переменных при старте
 sootMode = false;
 lastShootTime = 0;
}

function Update () {
 
 //Если режим удержания == тру, то задать длинну индикатора удержания
 if (shootMode == true) {
 indicatorPowerShoot = Time.time - startShoot;
 }
 // Как только кнопка нажата, объявить режим удержания == тру, и зафиксировать время начала удержания.
 if (Input.GetKeyDown(KeyCode.Mouse0)) {
 shootMode = true;
 startShoot = Time.time;
 
 }
 // Как только кнопка отжата...
 if (Input.GetKeyUp(KeyCode.Mouse0)) {
 //объявить режим удержания == фалс
 shootMode = false;
 // Если время прошедшее с момента последнего выстрела больше чем, задержка между выстрелами
 if (Time.time>(lastShootTime + shootSpeed)) {
 //Зафиксировать время окончания удержания...
 endShoot = Time.time;
 //И рассчитать силу выстрела
 powerShoot = endShoot - startShoot;
 // Если сила выстрела больше, или меньше заднных значений, вгоняем ее в рамки.
 if (powerShoot < minPowerShotRate){
 powerShoot = minPowerShotRate;}
 if (powerShoot > maxPowerShotRate){
 powerShoot = maxPowerShotRate;}
 
 //Оъявляем о существовании нового снаряда
 var bull_clone : GameObject;
 //Добаляем клон снаряда.
 bull_clone = Instantiate(bullet, transform.position, transform.rotation);
 // Задаем физические свойства.
 Physics.IgnoreCollision(bull_clone.collider, collider);
 // Даем импульс для полёта.
 bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse*powerShoot, ForceMode.Impulse);
 // Фиксируем время окончания выстрела, для рассчета задержки между выстрелами.
 lastShootTime = Time.time;
 }

 }

}
function OnGUI () {
        //Иммитируем прицел
    var PositionCrossX = Screen.width/2-5;
    var PositionCrossY = Screen.height/2-5;
        GUI.Box (Rect (PositionCrossX,PositionCrossY,10,10),"");
       
        //А вот тут, пониже, хотелось бы видеть удачную реализацию переменной "indicatorPowerShoot". Моя реализация работать не хочет =(
        var positionBarX = Screen.width/2-40;
        var positionBarY = Screen.height/2+30;
        GUI.BOx (Rect (PositionCrossX,PositionCrossY,indicatorPowerShoot*2,5),"");
        }
 


Не знаю, была ли необходимость приводить код целиком... Буду благодарен, если кто-то "расчехлит" меня по этому вопросу. За ранее спасибо.
greabock
UNец
 
Сообщения: 3
Зарегистрирован: 05 мар 2012, 13:27

Re: Прорисовка элементов GUI

Сообщение Golandez 05 мар 2012, 15:22

В OnGUI не будет рисоваться каждый кадр. Если это столь важно отрисовывать индикатор каждый кадр, сделайте индикатор в виде плайника и скейлите его.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Прорисовка элементов GUI

Сообщение greabock 05 мар 2012, 15:39

Golandez писал(а):...Если это столь важно отрисовывать индикатор каждый кадр, сделайте индикатор в виде плайника и скейлите его.

Боюсь, что совсем не понимаю, о чем ты говоришь. Если есть возможность, то поясни пожалуйста: Что есть "плайник"? Прости за невежество =(
greabock
UNец
 
Сообщения: 3
Зарегистрирован: 05 мар 2012, 13:27

Re: Прорисовка элементов GUI

Сообщение DDDENISSS 05 мар 2012, 21:49

greabock, плайник это plane. Т.е. мешь - плоскость.
Аватара пользователя
DDDENISSS
UNIверсал
 
Сообщения: 439
Зарегистрирован: 11 сен 2011, 20:33

Re: Прорисовка элементов GUI

Сообщение greabock 06 мар 2012, 05:51

DDDENISSS писал(а):greabock, плайник это plane. Т.е. мешь - плоскость.

Благодарю за ЛикБез.

Однако проблема была совсем не в этом. На самом деле код содержал кучу стилистических ошибок. После внимательной обработки, все заработало. Кому интересно вот работающий вариант.

Синтаксис:
Используется javascript

public var bulletImpulse : int = 100;   //Коофицент силы выстрела
public var maxPowerShootRate : int = 5; //Максимальный прирост от удержания
public var minPowerShootRate : int = 1;  //Минимальный прирост от удержания
public var shootSpeed : float = 0.5;        //Задержка перед следующим выстрелом
public var powerShootMultiplitter : float = 5;


private var powerShoot : float;    //Итоговая множитель силы выстрела
private var lastShootTime : float; //Время последнего выстрела
private var shootMode : boolean;   //Режим удержания, если он == тру, значит кнопка стрельбы удерживается.  
private var shootPing :float;
private var startShoot :float;


private var indicatorPowerShoot : float;  //Переменная определяющая длинну линии, указывающей на то, какова будет сила встрелаа если прекратить удержание в данный момент.

public var bullet : GameObject; //Непосредственно снаряд, которым мы стреляем.



function Start() {

//Задаем изначальное значение некоторых переменных при старте
 shootMode = false;
 lastShootTime = 0;
 indicatorPowerShoot = 1;
}

function Update () {
 
 //Если режим удержания == тру, то задать силу выстрела.
 if (shootMode == true ){
 shootPing = Time.time - startShoot;
 powerShoot = shootPing*powerShootMultiplitter + minPowerShootRate;
 }
 
 
 // Как только кнопка нажата и время с последнего выстрела больше чем задержка, объявить режим удержания == тру, и зафиксировать время начала удержания.
 if (Input.GetKeyDown(KeyCode.Mouse0)&& Time.time >(lastShootTime + shootSpeed)){
 shootMode = true;
 startShoot = Time.time;
 }
 
 
 // Как только кнопка отжата... или сила выстрела достигла максимума
 if (Input.GetKeyUp(KeyCode.Mouse0) || powerShoot >= maxPowerShootRate) {
 //Проверяем все соответствия
 if (Time.time>(lastShootTime + shootSpeed) && shootMode==true){
 //Оъявляем о существовании нового снаряда
 var bull_clone : GameObject;
 //Добаляем клон снаряда.
 bull_clone = Instantiate(bullet, transform.position, transform.rotation);
 // Задаем физические свойства.
 Physics.IgnoreCollision(bull_clone.collider, collider);
 // Даем импульс для полёта.
 bull_clone.rigidbody.AddForce(transform.forward*bulletImpulse*powerShoot, ForceMode.Impulse);
 // Фиксируем время окончания выстрела, для рассчета задержки между выстрелами.
 lastShootTime = Time.time;
  //объявить режим удержания == фалс
 shootMode = false;
 //Делаем силу выстрела снова минимальной
 powerShoot = minPowerShootRate;
 }
 }
 }
function OnGUI () {
        //Иммитируем прицел
    var positionCrossX = Screen.width/2-10;
    var positionCrossY = Screen.height/2-10;
        GUI.Box (Rect (positionCrossX,positionCrossY,20,20),"");
       
        //Индикатор работает, кстати.
        if (shootMode == true){
        var positionBarX = Screen.width/2 - 30;
        var positionBarY = Screen.height/2 + 30;
        GUI.Box (Rect (positionBarX,positionBarY,powerShoot*12,5),"");
        }
        }

 
 


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

Простите, что не разобравшись с кодом полез с вопросами.
greabock
UNец
 
Сообщения: 3
Зарегистрирован: 05 мар 2012, 13:27


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11