Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

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

Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 19 окт 2009, 16:08

Вот столкнусля при изучении JavaScript с тупым вопросом, но очень важным для меня! Подскажите, пожалуйста, как добавить(не указать новое, конкретное, а именно добавить) к переменной конкретное значение??
Вот кусочек кода:
Код: Выделить всё
function AddExperience () {
questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
experience+=50;
}
}

В функции AddExperience не срабатывает, в функциях OnGUI или Update или FixedUpdate работает, но прибавляет по 50 каждый фрейм, а нужно всего-то 1 разочек :D Выручайте
Последний раз редактировалось foonk 01 июн 2011, 15:29, всего редактировалось 1 раз.
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Tolking 19 окт 2009, 16:18

Если просто ответить на вопрос, то так:

Код: Выделить всё
function AddExperience () {
questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
experience+=50;
playerInfo.questMolochnik1=false;
}
}
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Zaicheg 19 окт 2009, 16:21

del
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 19 окт 2009, 16:25

К сожалению, так тоже не работает... (( Тем более в function AddExperience () {
А в Update работает, но по-старому, каждый фрейм прибавляет по 50... КОШМАР ;)
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Serge 19 окт 2009, 16:53

Ну чего кошмар то. Нужно всего лишь подумать и почитать документацию. Ваши мысли никто читать не умеет, и потому понять чего вы хотите никто кроме вас не сможет.
Попробуем применить логику. Что у вас является условием сложения if (questMilk==true)? Если выполняется в каждом фрейме, значит все время questMilk = true, что в таком случае нужно делать?
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 19 окт 2009, 20:32

Спасибо! Так конечно помогает, но тогда как, добавить скажем 100 денег, если левел персонажа становится больше и в условии стоит что при получении левела 1 деньги должны увеличиваться. Неужели нет функции, которая бы срабатывала 1 раз и сразу останавливалась??
Немного открою карты, чтоб было совсем понятно что я хочу ))
Код: Выделить всё
//ЗАДАЕМ ОСНОВНЫЕ ПАРАМЕТРЫ

//ПРИСОЕДИНЯЕМ КОНТРОЛЛЕР
var playerInfo : gamecontroller;



//имя
var PlayerName = "Player";
//деньги
var money : int = 0;
//уровень
var level : int = 0;

//ЗАДАЕМ УМЕНЯ
//сила(нанесение повреждений)
var strong : int = 0;
//выносливость(количество максимальных жизней)
var stamina : int = 0;
//защита
var difence : int = 0;
//ловкось(скорость)
var skill : int = 0;

private var showOptions : boolean = false;

//ДЕЛАЕМ ПОЛОСКУ ЖИЗНЕЙ, МАНЫ И ОПЫТА
var imageHealth : Texture;
var imageMana : Texture;
var imageExperience : Texture;
var health : float = 100;
var maxHealth : float = 100;
var mana : float = 100;
var maxMana : float = 100;
var experience : float = 0;
var maxexperience : float = 100;
function OnGUI(){
   var rectHP : Rect = Rect(10,500,150 * health/maxHealth ,20);
   var rectMP : Rect = Rect(10,525,150 * mana/maxMana ,20);
   var rectEXP : Rect = Rect(10,550,150 * experience/maxexperience ,20);
   GUI.DrawTexture (rectHP , imageHealth );
   GUI.DrawTexture (rectMP , imageMana );
   GUI.DrawTexture (rectEXP , imageExperience );
   GUI.Label (Rect (10, 500, 100, 30), "HP: " + health);
   GUI.Label (Rect (10, 525, 100, 30), "MP: " + mana);
   GUI.Label (Rect (10, 550, 100, 30), "EXP: " + experience);
   GUI.Label (Rect (70, 500, 100, 30), "/" + maxHealth);
   GUI.Label (Rect (70, 525, 100, 30), "/" + maxMana);
   GUI.Label (Rect (70, 550, 100, 30), "/" + maxexperience);
//ЗАКОНЧИЛИ  ПОЛОСКУ ЖИЗНЕЙ, МАНЫ И ОПЫТА

//ДЕЛАЕМ ОКНО СТАТИСТИКИ ПЕРСОНАЖА
if (GUI.Button(new Rect(Screen.width-85,550,80,25), "Stats")) {
showOptions = !showOptions;
}
if (showOptions) {
GUI.Window (0, new Rect (Screen.width-180-5, 30, 180, 375), WindowFunction, "Player stats");
}
}


//ОКНО СТАТИСТИКИ ПЕРСОНАЖА
function WindowFunction (id : int) {
   GUILayout.BeginVertical();
   //показываем имя персонажа   
   GUI.Label (Rect(10,20,150,25), "Name: " + PlayerName );
   GUI.Label (Rect(10,40,150,25), "Level: " + level );
   GUI.Label (Rect(10,60,150,25), "Money: " + money );
   GUI.Label (Rect(10,80,150,25), "Strong: " + strong );
   GUI.Label (Rect(10,100,150,25), "Stamina: " + stamina );
   GUI.Label (Rect(10,120,150,25), "Difence: " + difence );
   GUI.Label (Rect(10,140,150,25), "Skill: " + skill );
   GUILayout.EndVertical();
   }

//ПАРАМЕТРИРУЕМ ПОВЫШЕНИЕ НАВЫКОВ ПРИ ПОВЫШЕНИИ УРОВНЯ
function Update () {
if (experience==100) {
level++;
experience++;
}
if (level==1) {
//сила(нанесение повреждений)
strong = 1;
//выносливость(количество максимальных жизней)
stamina = 1;
//защита
difence = 1;
//ловкось(скорость)
skill = 1;
//деньги
money=200;
}



questMilk = playerInfo.moloko;
if (questMilk==5) {
experience+=100;
}

if (stamina==1) {
maxHealth=150;
}
}



Так вот, что не понятно: если бесконечное увеличение опыта я ограничиваю добавлением единицы опыта, но с увеличением на единицу левела это уже слишком )) и как быть с деньгами?
Ну ведь должен же быть простой выход,а?

Пробовал
Код: Выделить всё
BroadcastMessage ("AddMoney", 100.0);

function AddMoney (money : float) {
print (money);
}


И ведь принтит он правильную сумму денег (200) с учетом того что изначально есть 100. А как сделать чтоб не принт, а все таки money+=100???
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Serge 20 окт 2009, 06:35

Программу нужно разбить на логические куски. В определенный момент указываешь, какой кусок программы нужно выполнить и он выполниться один раз и тогда когда это будет нужно. Смотри пример кода, если и после этого будет не понятно, то посмотри какие-либо исходники и обрати внимание на то, как строиться логика программы.
Если и это не поможет, то стукнись вечером в аську, попробую объяснить.
Код: Выделить всё
var uvelichitUroven : false;
var drugajaFunkcija : false;

function Update () {
   // Твоя программа
   ..........
   
   // момент когда нужно увеличить уровень
   uvelichitUroven = true;
   
   // момент когда нужно другое действие
   drugajaFunkcija = true;

   
   
   //Проверяем нужно ли увеличивать уровень
   if uvelichitUroven {
      // делаем что нужно и сбрасывает условие выполнения
      ..........
      uvelichitUroven = false;
   }
   
   
   //Проверяем нужно ли делать друго действие
   if drugajaFunkcija {
      // делаем что нужно и сбрасывает условие выполнения
      ..........
      drugajaFunkcija = false;      
   }
   
}
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 20 окт 2009, 08:56

Спасибо, Serge! Я попробовал сделать как ты сказал, но к сожалению история повторяется... все параметры продолжают увеличиваться каждый фрейм... Вечером постучусь в аську.
Вот код:
Код: Выделить всё
//ЗАДАЕМ ОСНОВНЫЕ ПАРАМЕТРЫ
var addmoney = false;
var addlevel = false;
var addexp = false;
//ПРИСОЕДИНЯЕМ КОНТРОЛЛЕР
var playerInfo : gamecontroller;



//имя
var PlayerName = "Player";
//деньги
var money : int = 0;
//уровень
var level : int = 0;

//ЗАДАЕМ УМЕНЯ
//сила(нанесение повреждений)
var strong : int = 0;
//выносливость(количество максимальных жизней)
var stamina : int = 0;
//защита
var difence : int = 0;
//ловкось(скорость)
var skill : int = 0;

private var showOptions : boolean = false;

//ДЕЛАЕМ ПОЛОСКУ ЖИЗНЕЙ, МАНЫ И ОПЫТА
var imageHealth : Texture;
var imageMana : Texture;
var imageExperience : Texture;
var health : float = 100;
var maxHealth : float = 100;
var mana : float = 100;
var maxMana : float = 100;
var experience : float = 0;
var maxexperience : float = 100;
function OnGUI(){
   var rectHP : Rect = Rect(10,500,150 * health/maxHealth ,20);
   var rectMP : Rect = Rect(10,525,150 * mana/maxMana ,20);
   var rectEXP : Rect = Rect(10,550,150 * experience/maxexperience ,20);
   GUI.DrawTexture (rectHP , imageHealth );
   GUI.DrawTexture (rectMP , imageMana );
   GUI.DrawTexture (rectEXP , imageExperience );
   GUI.Label (Rect (10, 500, 100, 30), "HP: " + health);
   GUI.Label (Rect (10, 525, 100, 30), "MP: " + mana);
   GUI.Label (Rect (10, 550, 100, 30), "EXP: " + experience);
//ЗАКОНЧИЛИ  ПОЛОСКУ ЖИЗНЕЙ, МАНЫ И ОПЫТА

//ДЕЛАЕМ ОКНО СТАТИСТИКИ ПЕРСОНАЖА
if (GUI.Button(new Rect(Screen.width-85,550,80,25), "Stats")) {
showOptions = !showOptions;
}
if (showOptions) {
GUI.Window (0, new Rect (Screen.width-180-5, 30, 180, 375), WindowFunction, "Player stats");
}
}


//ОКНО СТАТИСТИКИ ПЕРСОНАЖА
function WindowFunction (id : int) {
   GUILayout.BeginVertical();
   //показываем имя персонажа   
   GUI.Label (Rect(10,20,150,25), "Name: " + PlayerName );
   GUI.Label (Rect(10,40,150,25), "Level: " + level );
   GUI.Label (Rect(10,60,150,25), "Money: " + money );
   GUI.Label (Rect(10,80,150,25), "Strong: " + strong );
   GUI.Label (Rect(10,100,150,25), "Stamina: " + stamina );
   GUI.Label (Rect(10,120,150,25), "Difence: " + difence );
   GUI.Label (Rect(10,140,150,25), "Skill: " + skill );
   GUILayout.EndVertical();
   }

//ПАРАМЕТРИРУЕМ ПОВЫШЕНИЕ НАВЫКОВ ПРИ ПОВЫШЕНИИ УРОВНЯ
function Update () {
if (experience==100) {
addlevel = true;
}
if (level==1) {
//сила(нанесение повреждений)
strong = 1;
//выносливость(количество максимальных жизней)
stamina = 1;
//защита
difence = 1;
//ловкось(скорость)
skill = 1;
//деньги
addmoney = true;
}

questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
addexp = true;
}

if (stamina==1) {
maxHealth+=50;
}

if (addexp==true) {
experience+=100;
addexp = false;
}

if (addlevel==true) {
level+=1;
addlevel = false;
}

if (addmoney==true) {
money+=100;
addmoney = false;
}
}
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Serge 20 окт 2009, 10:42

Непонятно одно место.
Код: Выделить всё
questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
   addexp = true;
}

Посмотри, бывает ли оно true? Значение переменных видно в Inspector-е. Похоже, ты запутался в своей логике. Чтобы найти твою ошибку одного кода мало, нужно к нему приложить проект или часть проекта с использованием этого кода.
О, сколько нам открытий чудных Готовят просвещенья дух И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель.
Аватара пользователя
Serge
UNIверсал
 
Сообщения: 476
Зарегистрирован: 20 мар 2009, 15:53
Откуда: Сибирь г. Омск
  • Сайт
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 20 окт 2009, 10:53

Ну почему же? Оно как баз бывает тру, как только выполняется условие квеста questMolochnik1. var playerInfo : gamecontroller; присоединяю геймконтроллер, который в свою очередь контроллироет выполнение квестов. А в PlayerStats как раз мы и проверяем, выполнен ли квест или нет строчка var playerInfo : gamecontroller;. Соответственно
Код: Выделить всё
questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
   addexp = true;
}

тут я проверяю, добавляем ли мы сейчас опыт, и если тру, то addexp = true; который в свою очередь изначально var addexp = false;, а при выполнении условия тру:
Код: Выделить всё
if (addexp==true) {
experience+=100;
addexp = false;
}
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Zavhoz 20 окт 2009, 11:23

вероятней всего у тебя playerInfo.questMolochnik1 не становится false после того как происходит добавление денег и прочего. да и както сложно написано, с кучей проверок, хотя может того требует ситуация... и я бы сделал так:
Код: Выделить всё
questMilk = playerInfo.questMolochnik1;
if (questMilk==true) {
   experience+=100;
   playerInfo.questMolochnik1=false;
}

другой причины я пока не вижу

п.с. упс, Tolking уже написал такое решение... если же после этого условие опять срабатывает, то причина выше чем данный вопрос, и надо искать что заставляет playerInfo.questMolochnik1 стать тру
FUNNY BLOX
Аватара пользователя
Zavhoz
UNITрон
 
Сообщения: 197
Зарегистрирован: 10 фев 2009, 07:23
Откуда: Караганда KZ
  • ICQ

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Tolking 20 окт 2009, 15:01

:) Я поэтому и написал "Если просто ответить на вопрос". Все зависит от логики. В данном случае нужно опыт добавлять там, где questMolochnik1 Становится Тру! И только в том случае если он не тру!

Код: Выделить всё
бла-бла-бла

if (playerInfo.questMolochnik1!=true)
{
experience+=50;
playerInfo.questMolochnik1=true;
}

бла-бла-бла

Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Zaicheg 20 окт 2009, 15:59

Я вижу приблизительное решение задачи так:

Код: Выделить всё
using UnityEngine;
using System.Collections;

public class One1 : MonoBehaviour
{
   public int level = 0; // текущий уровень
   public int exp = 0; // текущий опыт
   public int money = 0; // текущие деньги
   public int[] expLevel; // массив с планками опыта для каждого уровня
   public int levelsCount = 50; // количество уровней
   public bool[] questFinish; // массив выполнения квестов
   public bool[] questAwardTake; // массив получения наград
   public int questCount = 50;  // количество квестов
   
   void Start ()
   {
      // создаём массивы
      expLevel = new int[levelsCount];
      questFinish = new bool [questCount];
      questAwardTake = new bool [questCount];
      
      // инициализируем массивы
      for (int i = 0; i < questCount; i++)
      {
         questFinish[i] = false;
      }
      for (int i = 0; i < questCount; i++)
      {
         questAwardTake[i] = false;
      }
      for (int i = 0; i < levelsCount; i++)
      {
         expLevel[i] = i * 1000; // прогрессивная система повышения планки опыта
      }
   }
   
   void Update ()
   {
      // засчитываем выполнения квеста. Условие ставите своё или вообще выносите в отдельную функцию
      if (Input.GetKeyDown("k"))
      {
         questFinish[1] = true;
      }
      
      // если выполнение квеста засчитано, а награда не получена — вызываем функцию награды
      for (int i = 0; i < questCount; i++)
      {
         if (questFinish[i] == true && questAwardTake[i] == false)
            QuestAward(i);
      }
      
      // если опыт находится между двумя планками — вызываем функцию повышения уровня и присваиваем нижележащий уровень
      // фильтр — совпадение присваиваемого уровня текущему
      for (int i = 1; i < levelsCount; i++)
      {
         if (exp >= expLevel[i] && exp < expLevel[i+1] && level != i)
            LevelUp(i);
      }
   }
   
   // входящий параметр — номер квеста в массиве. Можете и именами сделать — как заблагорассудится
   // в зависимости от номера увеличиваем бабло и деньги
   // засчитываем получение награды
   void QuestAward(int questNumber)
   {
      if (questNumber == 0)
      {
         money += 100;
         exp += 2200;
      }
      if (questNumber == 1)
      {
         money += 500;
         exp += 8300;
      }
      questAwardTake[questNumber] = true;
   }
   
   // входящий параметр — планка, выше которой лежит опыт
   // присваиваем соответствующий планке уровень и даём бабло
   void LevelUp(int levelInput)
   {
      level = levelInput;
      money += levelInput * 100;
   }
}


Если есть замечания — с удовольствием доработаю.
Дьяченко Роман
e-mail: _zaicheg.reg@gmail.com
skype: zaicheg12
vkontakte: _vk.com/zaichegq
Работа: _wie3.com _www.sanviz.com
Аватара пользователя
Zaicheg
Адепт
 
Сообщения: 3024
Зарегистрирован: 19 июн 2009, 15:12
Откуда: Череповец

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение Tolking 20 окт 2009, 16:54

Ребята! Проверять в Апдейте нужно или нет дать опыт за выполненый квест - это все равно, что использовать GOTO. :)

А если у тебя 1000 квестов?
Опыт и т.п. нужно начислять тогда, когда становится понятным, что квест выполнен.
Код: Выделить всё
using UnityEngine;
using System.Collections;

public class One1 : MonoBehaviour
{
  void Update ()
   {
      // засчитываем выполнения квеста. Условие ставите своё или вообще выносите в отдельную функцию
      if (Input.GetKeyDown("k"))
      {
         questFinish[1] = true;
         QuestAward(1);
         if (exp >=expLevel[level+1])
          {
            LevelUp(level+1);
         }
    }
  }
   
   // входящий параметр — номер квеста в массиве. Можете и именами сделать — как заблагорассудится
   // в зависимости от номера увеличиваем бабло и деньги
   // засчитываем получение награды
   void QuestAward(int questNumber)
   {
      if (questNumber == 0)
      {
         money += 100;
         exp += 2200;
      }
      if (questNumber == 1)
      {
         money += 500;
         exp += 8300;
      }
      questAwardTake[questNumber] = true;
   }
   
   // входящий параметр — планка, выше которой лежит опыт
   // присваиваем соответствующий планке уровень и даём бабло
   void LevelUp(int levelInput)
   {
      level = levelInput;
      money += levelInput * 100;
   }
}

Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как осуществить добавление значения к переменной ЕДИНОЖДЫ?

Сообщение foonk 20 окт 2009, 20:59

БОЛЬШОЕ ВАМ ВСЕМ СПАСИБО!!! :-bd Буду разбираться :D
— 2010-й год. В Ладу Калину поставили первый Глонасс-приемник размером с утюг. В то же время Эппл выпускает плеер размером меньше спичечного коробка с цветным дисплеем и тачскрином.
Добавить foonk09 в Skype
Аватара пользователя
foonk
UNITрон
 
Сообщения: 302
Зарегистрирован: 16 май 2009, 20:25
Откуда: Москва
  • ICQ

След.

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

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

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