Вопрос на тему цикл For - Форум - Все для Unity3d

Все для Unity3d> Вопрос на тему цикл For - Форум>
Страница 1 из 11
Форум » Unity » Вопросы » Вопрос на тему цикл For (Вопрос знатокам C#)
Вопрос на тему цикл For
maxim738Дата: Вторник, 22.07.2014, 21:33 | Сообщение # 1
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Делал инвентарь , много уроков пересмотрел . все какие-то не законченные , решил сам дописывать .За основу взял скрипты у Alcatraz  тык и немного немного дописал  :
Первый скрипт Item.cs:

Код
using UnityEngine;
using System.Collections;
// для каждого объекта , который может находиться в инвентаре,должен висеть на пустом объекте в сцене
public class Item : MonoBehaviour {
     
    public int count;
    public string discription;    
    public float mass;
    public Texture2D texure;
    public GameObject obj;

     
     
}

Второй Inventory.cs:
Код
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class Inventory : MonoBehaviour {
     
    public List<Item> items = new List<Item>();
    public bool show = false;
    public GUISkin skin;
    public MouseLook cam;
    public MouseLook player;
    public float maxMass = 50f;
    public float currMass = 0f;    
    public Vector3 vec ;
    public SceneObjectDrop Cn ;
    public GameObject tempPU;
     [HideInInspector]public Item currItem;
     
     
    void Start() {
       RebuildMass();    
    }
     
    void AddMass(float mass) {
       currMass += mass;    
    }
     
    void RebuildMass() {
       currMass = 0f;
        
       for(int i = 0; i < items.Count; i++) {
          if(items[i]!=null) {
             if(items[i].count > 0) {
                currMass += items[i].count * items[i].mass;    
             }
          }
       }
    }
     
    void Update() {
//ВОТ ЗДЕСЬ ПРОБЛЕМА
       Ray ray = Camera.main.ScreenPointToRay (new Vector3 (Screen.width / 2, Screen.height / 2, 0));  
       RaycastHit hit;  
       if (Physics.Raycast (ray, out hit, 2f) && hit.collider.tag == "Brus" && Input.GetKeyUp (KeyCode.E)) {
          tempPU = hit.collider.gameObject;
          Cn = tempPU.GetComponent<SceneObjectDrop> ();
          for (int i = 0; i < items.Count; i++) // цикл перебирает все числа от 0 до items.Count , в моём случае - 25
{
             if (items  [i]== null) { если он находит пустые ячейки
                items [i]=Cn.pref; //то он заполняет их предметом , который я подобрал через рейкаст , а надо чтобы только одна одна ячейка заполнялась  
                Destroy(tempPU);
             }
       }
    }

       if(Input.GetKeyDown(KeyCode.I)) {
          show=!show;    
           
          if(show) {
             player.enabled = false;
             cam.enabled = false;
          }else{
              
             player.enabled = true;
             cam.enabled = true;    
              
          }
       }
    }
     
     
    void OnGUI() {

       if(show) {
          GUI.skin = skin;
          GUI.Window(0, new Rect(60f,50f,1070f,600f), InventoryBody, "Inventory");    
           
       }
    }

    public void Drop(Item item){
       item.count--;    
       RemoveItem(currItem);    
       currItem = null;
       Instantiate (item.obj, transform.position + vec, Quaternion.identity);
       }

     
    public void Use(Item item) {    
       item.count--;    
       RemoveItem(item);    
       currItem = null;
    }
     
     
    public void RemoveItem (Item item) {
       for(int i = 0; i < items.Count; i++) {
          if(items [i]== item) {
             items [i]= null;    
          }
       }
    }
     
    void InventoryBody(int id) {
       GUI.skin = skin;
       if(GUI.Button(new Rect(700f, Screen.height - 200f, 150f,50f), "Выход")) {
          currItem = null;
          show = false;
          player.enabled = true;
          cam.enabled = true;    
       }
        
        
        
        
        
       if(currItem) {
           
          GUI.DrawTexture (new Rect(600f,50f,80f,100f), currItem.texure);
          GUI.color = Color.red;
          GUI.Label (new Rect(700f,50f,400f,300f), "Описание: ");
          GUI.color = Color.white;
          GUI.Box (new Rect(600f,50f,400f,300f), "");
          GUI.Label (new Rect(700f,80f,400f,300f), currItem.discription);
           
           
          if(GUI.Button(new Rect(700f, 290f, 150f,50f), "Отмена")) {
             currItem = null;
              
          }
           
           
          if(GUI.Button(new Rect(700f, 230f, 150f,50f), "Использовать")) {
             Use(currItem);
          }
           
          if(GUI.Button(new Rect(700f,170f, 150f,50f), "Выкинуть")) {
             Drop(currItem);
          }
           
       }
        
        
       GUILayout.BeginArea(new Rect(60f,60f,100f,600f));
        
       for(int i = 0; i < 5; i++) {
          if(items[i]!= null) {
             if(GUILayout.Button(items[i].texure, GUILayout.Width(100f),GUILayout.Height(100f))) {
                currItem = items[i];       
             }
          }else{
             GUILayout.Box("", GUILayout.Width(100f),GUILayout.Height(100f));
          }
       }
        
       GUILayout.EndArea();
        
        
       GUILayout.BeginArea(new Rect(165f,60f,100f,600f));
        
       for(int i = 5; i < 10; i++) {
          if(items[i]!= null) {
             if(GUILayout.Button(items[i].texure, GUILayout.Width(100f),GUILayout.Height(100f))) {
                currItem = items[i];    
             }
          }else{
             GUILayout.Box("", GUILayout.Width(100f),GUILayout.Height(100f));
          }
       }
        
       GUILayout.EndArea();
        
       GUILayout.BeginArea(new Rect(270f,60f,100f,600f));
        
       for(int i = 10; i < 15; i++) {
          if(items[i]!= null) {
             if(GUILayout.Button(items[i].texure, GUILayout.Width(100f),GUILayout.Height(100f))) {
                currItem = items[i];       
             }
          }else{
             GUILayout.Box("", GUILayout.Width(100f),GUILayout.Height(100f));
          }
       }
        
       GUILayout.EndArea();
        
        
       GUILayout.BeginArea(new Rect(375f,60f,100f,600f));
        
       for(int i = 15; i < 20; i++) {
          if(items[i]!= null) {
             if(GUILayout.Button(items[i].texure, GUILayout.Width(100f),GUILayout.Height(100f))) {
                currItem = items[i];             
             }
          }else{
             GUILayout.Box("", GUILayout.Width(100f),GUILayout.Height(100f));
          }
       }
        
       GUILayout.EndArea();
        
        
       GUILayout.BeginArea(new Rect(480f,60f,100f,600f));
        
       for(int i = 20; i < 25; i++) {
          if(items[i]!= null) {
             if(GUILayout.Button(items[i].texure, GUILayout.Width(100f),GUILayout.Height(100f))) {
                currItem = items[i];                
             }
          }else{
             GUILayout.Box("", GUILayout.Width(100f),GUILayout.Height(100f));
          }
       }
        
       GUILayout.EndArea();
        
    }
     
}

Третий(мой)скрипт , который висит на самих объектах и держит ссылку на свою переменную Item
Код
using UnityEngine;
using System.Collections;

public class SceneObjectDrop : MonoBehaviour {
    public Item pref;

}


Как сделать чтобы цикл возвращал только первую пустую ячейку  ,а не все ?Во втором скрипте подробнее.


Скрипты на заказ, помощь в исправлении ошибок ,работа с чужим кодом.В лс,недорого.
 
zodiakДата: Среда, 23.07.2014, 06:40 | Сообщение # 2
Новый писатель
Группа: Пользователи
Сообщений: 2
Статус: Offline
Программирование нада учить не по видеоурокам по юнити, а с книжкой по языку.

Если нужно выйти из цикла после нахождения первого пустого элемента, можно воспользоваться оператором break.
 
maxim738Дата: Среда, 23.07.2014, 15:26 | Сообщение # 3
Новый писатель
Группа: Пользователи
Сообщений: 18
Статус: Offline
Цитата zodiak ()
Программирование нада учить не по видеоурокам по юнити, а с книжкой по языку. Если нужно выйти из цикла после нахождения первого пустого элемента, можно воспользоваться оператором break.
Слава небесам , есть люди которым не пох на других.Спасибо , вот изменённый код:
Код
void Update() {
       Ray ray = Camera.main.ScreenPointToRay (new Vector3 (Screen.width / 2, Screen.height / 2, 0));  
       RaycastHit hit;  
       if (Physics.Raycast (ray, out hit, 2f) && hit.collider.tag == "Brus" && Input.GetKey (KeyCode.E)) {
          tempPU = hit.collider.gameObject;
          Cn = tempPU.GetComponent<SceneObjectDrop> ();
          for (int i = 0; i < items.Count; i++) {
             if (items  [i]== null) {    
                items [i]=Cn.pref;
                Destroy(tempPU);
                break;
                 
             }
          }
}
       }

Буду знать , кстати, нашёл неплохой сайт , посвящённый языкам программирования тык.


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