С Новым годом! Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 3

Проблема с классами (возможно с классами)

20.02.2019, 18:45. Показов 1493. Ответов 6

Студворк — интернет-сервис помощи студентам
В общем такое дело. На днях надумал соорудить игру, эдакую экономическую стратегию. И попутно разрабатывая механику наткнулся на ряд проблем. Сразу скажу опыт в С# небольшой и возникают вопросы на самом ровном месте.

Суть в том, что при нажатии синей кнопки (смотрим на прикрепленную картинку) создается корабль на карте. У корабля есть следующие параметры: скорость, имя корабля (редактируется игроком или задается рандомно, как в Anno 1404), размер трюма. Посмотреть всю информацию о созданных кораблях можно из панели 2 вызванной красной кнопкой. В ней есть Бокс ScrollView в который добавляется или удаляется количество кораблей. Каждый блок несет информацию о корабле, где 4 изображение, 5 имя корабля, 6, 7 и 8 это скорость, размер трюма и еще какая-нибудь переменная соответственно. Есть возможность создания (строительства) кораблей, корабли можно строить разных типов (будь то фрегат, шлюпка или яхта), у каждого класса своя максимальная скорость, максимальный объем трюма и тд. Т.е. смысл в том, что могут создаваться несколько кораблей одного класса.

Суть вопроса такова: писать примеры кода как это оформить не нужно (хотя это будет очень большая и приятная помощь для меня), я не знаю как это в конечном счете сделать. Где-то выглядел, что можно все оформить через классы, а потом через объекты классов и запихнуть все это в массивы. Но, возможно мой программный мозг (если можно его ак назвать)) не позволяет мне додуматься до этого, как после этого можно обратиться к каждому отдельно взятому кораблю, который будет соответственно префабом создающимся на карте. Как можно реализовать систему погрузки товара на этот корабль, на отдельный корабль.

Будо очень благодарен за любую проявленную помощь, которая поможет встать мне на путь истинный (так скажем) в создании!
Миниатюры
Проблема с классами (возможно с классами)  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.02.2019, 18:45
Ответы с готовыми решениями:

Проблемы с классами
Уже какой день не могу разобраться с классами. Вот код: using UnityEngine; using System.Collections; public class Main :...

Проблема с классами
У меня возникла проблема с недопониманием классов в С++ помогите пожалуйста !!! в icq 437551173 ;)

Проблема с Классами
// VectorClass.cpp : main project file. #include "stdafx.h" #include <iostream> using namespace System; using...

6
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.02.2019, 20:50
Цитата Сообщение от SchwarzWiking Посмотреть сообщение
корабля есть следующие параметры: скорость, имя корабля (редактируется игроком или задается рандомно, как в Anno 1404), размер трюма. Посмотреть всю информацию о созданных кораблях можно из панели 2 вызванной красной кнопкой. В ней есть Бокс ScrollView в который добавляется или удаляется количество кораблей. Каждый блок несет информацию о корабле, где 4 изображение, 5 имя корабля, 6, 7 и 8 это скорость, размер трюма и еще какая-нибудь переменная соответственно. Есть возможность создания (строительства) кораблей, корабли можно строить разных типов (будь то фрегат, шлюпка или яхта), у каждого класса своя максимальная скорость, максимальный объем трюма и тд. Т.е. смысл в том, что могут создаваться несколько кораблей одного класса.
В простейшем виде, модель может выглядеть так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    class Ship
    {
        public string Name { get; set; }
        public ShipType Type { get; set; }
        public string ImageName { get; set; }
        public float CurrentLoad { get; set; }
        public float MaxLoad { get; set; }
        public float MaxSpeed { get; set; }
    }
 
    enum ShipType
    {
        Frigate, Dinghy, Yacht
    }
 
    class User
    {
        public string Name { get; set; }
        public List<Ship> Ships { get; private set; }
 
        public User()
        {
            Ships = new List<Ship>();
        }
    }
1
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
20.02.2019, 21:11
Storm23, для чего такие свойства? Чтобы в инспекторе не было видно и не работала сериализация?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
20.02.2019, 21:34
Цитата Сообщение от Cr0c Посмотреть сообщение
для чего такие свойства? Чтобы в инспекторе не было видно и не работала сериализация?
Это модель, она не предназначена для отображения в инспекторе. Она вообще к инспектору не имеет отношения.
И сериализация для этих классов вполне себе работает.
А свойства - потому что это хороший стиль программирования. Если нужно будет сделать события или проверки - в свойствах это можно реализовать, а в полях - нет.
0
 Аватар для Cr0c
753 / 600 / 204
Регистрация: 06.08.2015
Сообщений: 2,432
20.02.2019, 21:54
Storm23, ну уж точно не сериализуется встроенными средствами и необходим модуль для загрузки/сохранения содержимого такого класса (не для новичков точно).
0
0 / 0 / 0
Регистрация: 20.02.2019
Сообщений: 3
20.02.2019, 22:22  [ТС]
Storm23, Спасибо за ответ. Дельный ответ. Но как после можно обращаться к ним? Через лист мне кажется проблематично будет. Мне кажется. Еще у меня были мысли сделать несколько префабов с различными показателями ( скорость, размер и т.д.). Так в дальнейшем и будет сделано, потому что корабли отличаются внешне. Но проблема в том, как можно после разместить информацию в Scrollview на панели. Но имея несколько одинаковых префабов клонированных с помощью функции Instantiate, можно ли их потом в дальнейшем редактировать (по принципу апгрейда)? И как их можно запихнуть в Scrollview?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
21.02.2019, 03:55
Лучший ответ Сообщение было отмечено SchwarzWiking как решение

Решение

Цитата Сообщение от SchwarzWiking Посмотреть сообщение
Но как после можно обращаться к ним? Через лист мне кажется проблематично будет. Мне кажется. Еще у меня были мысли сделать несколько префабов с различными показателями ( скорость, размер и т.д.). Так в дальнейшем и будет сделано, потому что корабли отличаются внешне. Но проблема в том, как можно после разместить информацию в Scrollview на панели. Но имея несколько одинаковых префабов клонированных с помощью функции Instantiate, можно ли их потом в дальнейшем редактировать (по принципу апгрейда)? И как их можно запихнуть в Scrollview?
Я не могу вас научить программировать за пять минут.
Ниже приводится пример в котором используется модель, которую я описал выше.
Если вы поймете как это все работает - я могу чуть более усложнить пример и приблизить его к реальным условиям.
А если же он для вас слишком сложен - ну тогда пусть вам посоветуют что-нить попроще.

Классы модели:
Ship
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using System;
 
[Serializable]
public class Ship
{
    public string Name { get; set; }
    public ShipType Type { get; set; }
    public string ImageName { get; set; }
    public float CurrentLoad { get; set; }
    public float MaxLoad { get; set; }
    public float MaxSpeed { get; set; }
    public User Owner { get; set; }
}
 
[Serializable]
public enum ShipType
{
    Frigate, Dinghy, Yacht
}

User
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections;
using System.Collections.Generic;
 
[Serializable]
public class User
{
    public string Name { get; set; }
    public List<Ship> Ships { get; private set; }
 
    public User()
    {
        Ships = new List<Ship>();
    }
 
    public Ship CreateShip()
    {
        var ship = new Ship { Name = "New Ship " + UnityEngine.Random.Range(1, 10000) };
        ship.Type = (ShipType)UnityEngine.Random.Range(0, 3);
        ship.MaxLoad = 1000;
        ship.CurrentLoad = UnityEngine.Random.Range(0, 200);
        ship.MaxSpeed = 40;
        ship.Owner = this;
        ship.ImageName = new[] { "Ship1", "Ship2" }[UnityEngine.Random.Range(0, 2)];
 
        Ships.Add(ship);
 
        return ship;
    }
}

SaverLoader
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using UnityEngine;
 
public class SaverLoader
{
    public static User LoadUser()
    {
        var path = Application.persistentDataPath + "user.dat";
 
        if (File.Exists(path))
        try
        {
            using (var fs = File.OpenRead(path))
                return (User)new BinaryFormatter().Deserialize(fs);
        }
        catch { /*some Deserialize error*/ }
 
        return new User() { Name = "User" };
    }
 
    public static void SaveUser(User user)
    {
        var path = Application.persistentDataPath + "user.dat";
 
        using (var fs = File.Create(path))
            new BinaryFormatter().Serialize(fs, user);
    }
}


Контроллеры:
UserController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
using UnityEngine;
 
public class UserController : MonoBehaviour
{
    public static UserController Instance { get; set; }
    public User CurrentUser { get; set; }
 
    public ShipsListController ShipsListController;
 
    private void Awake()
    {
        Instance = this;
 
        LoadCurrentUser();
        ShipsListController.Build(CurrentUser);
    }
 
    void LoadCurrentUser()
    {
        CurrentUser = SaverLoader.LoadUser();
    }
 
    void SaveCurrentUser()
    {
        SaverLoader.SaveUser(CurrentUser);
    }
 
    #region Button handlers
 
    public void OnCreateShipClick()
    {
        CurrentUser.CreateShip();
        ShipsListController.Build(CurrentUser);
    }
 
    public void OnLoadClick()
    {
        LoadCurrentUser();
        ShipsListController.Build(CurrentUser);
    }
 
    public void OnSaveClick()
    {
        SaveCurrentUser();
    }
 
    #endregion
}

ShipsListController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class ShipsListController : MonoBehaviour
{
    public ShipInfoController ShipInfoPrefab;
    public RectTransform Content;
 
    User user;
 
    public void Build(User user)
    {
        this.user = user;
 
        //clear panel
        while (Content.childCount > 0)
            DestroyImmediate(Content.GetChild(0).gameObject);
 
        //create panels for each ship
        foreach(var ship in user.Ships)
        {
            var ctrl = Instantiate(ShipInfoPrefab, Content);
            ctrl.Build(ship);
        }
    }
}

ShipInfoController
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
using UnityEngine;
using UnityEngine.UI;
 
public class ShipInfoController : MonoBehaviour
{
    Ship ship;
 
    public Image Image;
    public Text ShipName;
    public Text Load;
    public Text Speed;
 
    public void Build(Ship ship)
    {
        this.ship = ship;
 
        ShipName.text = ship.Name;
        Load.text = ship.CurrentLoad + " / " + ship.MaxLoad;
        Speed.text = ship.MaxSpeed.ToString();
        Image.sprite = Resources.Load<Sprite>("Sprites/" + ship.ImageName);
    }
 
    public void OnCloseClick()
    {
        ship.Owner.Ships.Remove(ship);
        Destroy(gameObject);
    }
}




Проект целиком:
Вложения
Тип файла: zip Ships.zip (1.14 Мб, 4 просмотров)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.02.2019, 03:55
Помогаю со студенческими работами здесь

Проблема с классами
Всем привет! Решил вспомнить, некогда изучавшийся, С++ и .... Подскажите Main.cpp ...

Проблема с классами конструктора
при отображении конструктора формы, выходит это окно:

Небольшая проблема с классами
Всем привет. Дано задание: Расширить иерархию классов с использованием виртуального абстактного класса в качестве основы иерархии. ...

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

Проблема с классами: код, написаный по книге, выделяется как неправильный
Новичок в C#. Читаю вот эту книгу В ней всё написанно очень понятно, но у меня возникла проблема с классами. Если я не затрагиваю...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru