2015-10-19 1 views
-2

Я пробовал сделать систему вознаграждения 3 звезды, и я сделал это в основном. Система работает нормально, если я пройду уровень ниже 7 шагов, я зарабатываю 3 звезды.Unity 3D 3 Star Reward System Logic (C#)

(int step <7) //    3 Star 
(int step >7 && <12) //  2 star 
(int step >12)  //   1 star 

Итак, вот в чем проблема. Например, я заработал 3 звезды в lvl 1. Позже я снова сыграл lvl 1, и я прошел шаг «1-го уровня»> 12. Код меняет звезды на 1 звезда. Я хочу, если бы я заработал до 3-х звезд, не показываю 2 или 1 звезду. Если я заработал 2 звезды, не покажу 1 звезду.

My C# skill недостаточно для написания кода для кодирования этого состояния.

LEVELS Class 
public Sprite Star1; 
public Sprite Star2; 
public Sprite Star3; 

public Image[] Stars; 

void Start() 
{  
    //PlayerPrefs.SetInt("Level 1",1);  
    if (PlayerPrefs.GetInt("Level 1") ==1) 
    {    
     LevelNumbers[0].text = "1"; 
     PlayerPrefs.SetInt("Level 1",1); 

     if (PlayerPrefs.GetInt("L1St")==1) 
     { 
      Stars[0].sprite = Star1;    
     } 
     else if (PlayerPrefs.GetInt("L1St")==2) 
     { 
      Stars[0].sprite = Star2; 
     }  
     else if (PlayerPrefs.GetInt("L1St")==3) 
     { 
      Stars[0].sprite = Star3; 
     }  
    } 

Вот вторая часть:

void OnCollisionEnter(Collision coll) 
{ 
    if (man1 == false & man2 == false &(coll.gameObject.tag=="Finish")) 
    { 
     // Application.LoadLevel("Levels");  
     PlayerPrefs.SetInt("Level 1",1); 

     if(Application.loadedLevelName == "Level1") 
     {  
      PlayerPrefs.SetInt("Level 2",1); 

      if(step >12) 
      { 
       if (PlayerPrefs.GetInt("L1St") ==0) 
       { 
        PlayerPrefs.SetInt("L1St",1); /// Do 1 Star 
       } 
      } 

      if(step >7 && step <12) 
      { 
       if (PlayerPrefs.GetInt("L1St") ==0 || PlayerPrefs.GetInt("L1St")==1) 
       { 
        PlayerPrefs.SetInt("L1St",2); /// Do 2 Star 
       } 
      } 

      if(step <=7) 
      { 
       if (PlayerPrefs.GetInt("L1St") ==0||PlayerPrefs.GetInt("L1St") ==1 || PlayerPrefs.GetInt("L1St") ==2) 
       { 
        PlayerPrefs.SetInt("L1St",3); /// Do 3 Star 
       } 
      } 

      Application.LoadLevel("levels"); 
     } 

Также я изменил вторую часть (в нижней части), когда я прохожу уровень в рамках 7 шага я заработать 3 звезды в лвл 1. происходит L1St = 3 and Level1StarCounter = 4. Но позже я снова выполнил уровень 1 за 7 шагов Level1StarCounter Не меняется, но L1St собирается . Я не знаю, как это можно сделать.

void OnCollisionEnter(Collision coll) 
{ 
    if (man1 == false & man2 == false &(coll.gameObject.tag=="Finish")) 
    { 
     // Application.LoadLevel("Levels"); 
     PlayerPrefs.SetInt("Level 1",1); 

     if(Application.loadedLevelName == "Level1") 
     { 
      PlayerPrefs.SetInt("Level 2",1); 

      if(step >12) 
      { 
       if (PlayerPrefs.GetInt("LV1StarCounter")<= PlayerPrefs.GetInt("L1St")) 
       { 
        PlayerPrefs.SetInt("L1St",1); 
        PlayerPrefs.SetInt("LV1StarCounter",2); 
       } 
      } 
      else if(step >7 && step <12) 
      { 
       if (PlayerPrefs.GetInt("LV1StarCounter")<= PlayerPrefs.GetInt("L1St")) 
       { 
        PlayerPrefs.SetInt("L1St",2); 
        PlayerPrefs.SetInt("LV1StarCounter",3); 
       } 
      } 
      else if(step <=7) 
      { 
       if (PlayerPrefs.GetInt("LV1StarCounter")<= PlayerPrefs.GetInt("L1St")) 
       { 
        PlayerPrefs.SetInt("L1St",3); 
        PlayerPrefs.SetInt("LV1StarCounter",4); 
       } 
      } 

      Application.LoadLevel("levels"); 
     } 

ответ

0

Ваша логика все запутанна, но по крайней мере кто-то исправил формирование. Итак, что вы делаете

if(step > 12) 
{ 
    if (PlayerPrefs.GetInt("LV1StarCounter")<= PlayerPrefs.GetInt("L1St")) 
    { 
     PlayerPrefs.SetInt("L1St",1); 
     PlayerPrefs.SetInt("LV1StarCounter",2); 
    } 
} 

Итак, если вы получить 3 звезды, то Lv1StarCounter получает значение 4 и L1St получает значение 3. Когда вы получаете 1 звезда, потому что step > 12, он будет делать сравнение в КРП -statement: if(PlayerPrefs.GetInt("LV1StarCounter") <= PlayerPrefs.GetInt("L1St")), который оценивается как if(4 >= 3), который, в свою очередь, вычисляет if(true), и, следовательно, достигается внутренний блок, который сохранит однозвездочный рейтинг. Нет причин, по которым вы должны создать другой «CounterVariable», который можно использовать при сравнении. Перестройте свою логику, например, вы определите количество звезд, которые вы хотите кредитовать, а затем проверьте, сколько запусков игрок уже получил. Итак, в каком-то псевдокоде это выглядит так:

//Figure out the rating 
int stars = 0; 
if(step < 7) stars = 3; 
else if(step > 7 && step < 12) stars = 2; 
else if(step > 12) stars = 1; 

//Did the player get more stars than previosly saved? 
if(stars > PlayerPrefs.GetInt("Lv1Stars")) 
{ 
    //Yes, save the new value 
    PlayerPrefs.SetInt("Lv1Stars", stars); 
} 
//else do NOT save anything. 
+0

Maximilian Gerhardt. Я не очень хорош на C#, а также на английском. Но ты помог мне. Он работает дополнительно ı узнал от вас простоту. Спасибо. –