Пятница, 19 Апреля 2024, 15:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Город для игры на Unity
Город для игры на Unity
DeadDayДата: Вторник, 28 Января 2020, 09:02 | Сообщение # 1
New game Studio
Сейчас нет на сайте
Всем привет. Хотел бы поработать с Unity. Так - то опыта до этого было очень мало. Ни на что крупное не настроен. Интересует вот что.
1. Как сделать карту города как в игре godfather 2? Чтоб она была такая же интерактивная?

2. Возможность взаимодействия со всеми объектами на карте (дома).
3. Текстурировать ни чего не нужно будет. Все объекты будут в минимальной детализации.

На сколько большую можно сделать карту?

Подскажите куда копать в данном напровлении.

Заранее спасибо.



New Games Studio
---------------------------------------------------------------------------------------
Проекты:
DeadDay - Online
--- Мертвый день: Выживание
InsaneSystemsДата: Вторник, 28 Января 2020, 10:56 | Сообщение # 2
участник
Сейчас нет на сайте
DeadDay, ты бы ещё спросил, как сделать мморпг :D Вопрос неконкретный, ответом на него можно писать целую статью. Что именно непонятно в реализации? Судя по скриншотам, делаешь 3D-модель города или собираешь на кубиках в движке, в конкретных точках расставляешь пустышки (или же берёшь дома вместо этого), которые будут координатами для вывода интерактивных точек, затем по их позициям рисуешь на интерфейсе то что тебе нужно (через Camera.WorldToScreenPoint например), а дальше уже просто работаешь с нужными тебе в интерфейсе фичами. Всё остальное - просто обычная игровая логика, по которой я тоже не увидел конкретных вопросов.

Цитата

На сколько большую можно сделать карту?

Насколько хватит сил ;)


Сообщение отредактировал InsaneSystems - Вторник, 28 Января 2020, 10:57
drcrackДата: Вторник, 28 Января 2020, 10:59 | Сообщение # 3
старожил
Сейчас нет на сайте
Цитата
Хотел бы поработать с Unity. Так - то опыта до этого было очень мало. Ни на что крупное не настроен.

тогда начни с тетриса, а не 3д карты как в гф 2
DeadDayДата: Вторник, 28 Января 2020, 11:39 | Сообщение # 4
New game Studio
Сейчас нет на сайте
drcrack, Да сэр. Обязательно воспользуюсь твоим, крайне важным для меня советом.

InsaneSystems,
1. Создавать части города в blender`e, а потом соединять в движке? Или же правильнее каждый объект (дома, и т.д.) создавать по отдельности и собирать город уже в движке.

Объясню собственно что вообще нужно.

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



New Games Studio
---------------------------------------------------------------------------------------
Проекты:
DeadDay - Online
--- Мертвый день: Выживание
InsaneSystemsДата: Вторник, 28 Января 2020, 12:48 | Сообщение # 5
участник
Сейчас нет на сайте
DeadDay, интерактивные объекты (дома) лучше делать отдельными моделями, чтобы можно было их визуально подсветить (т.к. отдельный объект, на цельной модели карты это проблема) и проще было настраивать карту. Какие-нибудь дороги и прочее можно и одной моделью.

Сообщение отредактировал InsaneSystems - Вторник, 28 Января 2020, 12:52
DeadDayДата: Вторник, 28 Января 2020, 13:01 | Сообщение # 6
New game Studio
Сейчас нет на сайте
InsaneSystems, Как быть, если все объекты интерактивные? Вот со всеми объектами на карте можно было взаимодействовать (дом, машина, мусорка и т.д.).


New Games Studio
---------------------------------------------------------------------------------------
Проекты:
DeadDay - Online
--- Мертвый день: Выживание
InsaneSystemsДата: Среда, 29 Января 2020, 00:14 | Сообщение # 7
участник
Сейчас нет на сайте
DeadDay, ну тогда моделлить целиком только землю, уж она-то вряд ли будет интерактивная. Остальное отдельными моделями - мусорки, машины, дома. С таким стилем графики и с такой высоты это не очень большая проблема. Сильной нагрузки на ПК не создаст при правильной настройке.
DeadDayДата: Среда, 29 Января 2020, 06:27 | Сообщение # 8
New game Studio
Сейчас нет на сайте
InsaneSystems, Спасибо за совет.
Цитата InsaneSystems ()
С таким стилем графики и с такой высоты это не очень большая проблема.

Мне нравиться такой стиль)

Цитата InsaneSystems ()
при правильной настройке.

Ну осталось за малым))) Настроить правильно(((



New Games Studio
---------------------------------------------------------------------------------------
Проекты:
DeadDay - Online
--- Мертвый день: Выживание
alewДата: Воскресенье, 16 Февраля 2020, 12:18 | Сообщение # 9
уже был
Сейчас нет на сайте
Повесь на камеру

Код


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class createDis : MonoBehaviour
{
     List<int> listInfo = new List<int>();// владелец, дата постройки, количество этажей
    string[] owner  = { "S O N Y",  "SAMSUNG",  "B M W", "COMMERCIAL", "residential 1","residential 2",
        "residential 3", "residential 4","commercial2", "commercial3" } ;
    int[] price = {10,5,23,13,9,7,5,3,6,8 };
    GameObject cursor;
    Vector3 cursorPos;
    GameObject plane;
    enum status { no, move};
    status mouse = status.no;
    Vector2 mt;
    Vector2 screenSize;
    bool drawInfo = false;
    public string nameSel ;
    string[] textInfo = { "owner", "data", "price", "floor" };
    Rect winInfoRect;
    void Start()
    {
        plane = GameObject.CreatePrimitive(PrimitiveType.Quad);
        plane.transform.position = Vector3.zero;
        plane.transform.eulerAngles = new Vector3(90, 0, 0);
        plane.transform.localScale = new Vector3(100, 100,1);
        plane.name = "zemlya";
        Destroy(plane.GetComponent<Collider>());
        Renderer r = plane.GetComponent<MeshRenderer>();
        r.material = new Material(Shader.Find("Standard"));
        r.material.color = new Vector4(0.343f, 0.268f, 0.433f, 1.0f);
        r.material.name = "zemCol";
        createCUBE(plane.transform.position, new Vector3(100, 100, 1), 0.11f);
        
        transform.position = new Vector3(-5.6f, 38.0f, -49.0f);
        transform.eulerAngles = new Vector3(49.0f, 0.0f, 0.0f);
        Camera.main.fieldOfView = 49;
        screenSize = new Vector2(Screen.width, Screen.height);

        cursor = GameObject.CreatePrimitive(PrimitiveType.Cube);
        Destroy(cursor.GetComponent<Collider>());
        Renderer rc = cursor.GetComponent<MeshRenderer>();
        rc.material = new Material(Shader.Find("Standard"));
        rc.material.color = new Vector4(0.99f, 0.0f, 0.07f, 1.0f);
        winInfoRect = new Rect(0, 0, screenSize.x / 5, screenSize.y / 3);
    }
    void Update()
    {
        if(Input.GetMouseButtonDown(0) && mouse == status.no)
        {
            mouse = status.move;
            mt = Input.mousePosition;
        }
        if(Input.GetMouseButtonUp(0) && mouse == status.move)
        {
            mouse = status.no;
        }
        if(mouse == status.move)
        {
            Vector3 pos = transform.position;
            pos.x +=  (mt.x - Input.mousePosition.x)/screenSize.x *100;
            pos.z += (mt.y - Input.mousePosition.y) / screenSize.y * 100;
            transform.position = pos;
            mt = Input.mousePosition;
            drawInfo = false;
        }

        if(mouse == status.no)
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            Physics.Raycast(ray, out hit);
            if (hit.collider != null)
            {
                nameSel = hit.collider.gameObject.name;
                drawInfo = true;
                int numShift;
                string n = nameSel.Substring(6, nameSel.Length - 6);
                int.TryParse(n, out numShift);
                textInfo[0] ="owner: " + owner[listInfo[numShift * 10]];
                textInfo[1] = "date: " + listInfo[numShift * 10 + 1];
                textInfo[2] = "floor: " + listInfo[numShift * 10 + 2];
                textInfo[3] = "price: " + listInfo[numShift * 10 + 3];
                Vector3 posCur = new Vector3(listInfo[numShift * 10 + 4], listInfo[numShift * 10 + 5], listInfo[numShift * 10 + 6]);
                Vector3 scalCur = new Vector3(listInfo[numShift * 10 + 7], listInfo[numShift * 10 + 8], listInfo[numShift * 10 + 9]);
                scalCur *= 1.1f;
                cursor.SetActive(true);
                cursor.transform.position = posCur;
                cursor.transform.localScale = scalCur;
            }
            else
            {
                drawInfo = false;
                cursor.SetActive(false);
            }
        }

    }
    private void OnGUI()
    {
        if (drawInfo)
        {
            GUI.Window(1, winInfoRect, WinFunc, "INFO");
        }
    }
    public void WinFunc( int num)
    {
        GUILayout.Button(textInfo[0]);
        GUILayout.Button(textInfo[1]);
        GUILayout.Button(textInfo[2]);
        GUILayout.Button(textInfo[3]);
    }
    void createCUBE(Vector3 pos, Vector3 scal, float qual)
    {
        int namCount = 0;
        //GameObject g;
        int w, l, h;
        bool findFree, next;
        float sX = pos.x - scal.x/2;
        float sZ = pos.z - scal.y / 2;
        int[,] m = new int[(int)scal.x, (int)scal.y];
        m.Initialize();
        int minCell = 7;
        
            for (int y = 0; y < scal.y- minCell; y++)
            for (int x = 0; x < scal.x - minCell; x++)
            {
                int r = Random.Range(1, 10);
                if (r < Random.Range(1, 10 * qual))
                {
                     w = Random.Range(1, 5);
                     l = Random.Range(1, 5);
                     h = Random.Range(1, 10);
                    findFree = true;
                    while (findFree)
                    {
                        next = false;
                        for (int xx = 0; xx < w; xx++)
                        {
                            for (int yy = 0; yy < l; yy++)
                            {
                    if (m[x + xx, y + yy] == 1)
                    {
                    next = true;
                    break;
                    }
                            }
                            if (next) break;
                        }
                        if (next)
                        {
                            x += 1;
                            if (x >= scal.x - minCell)
                            {
                    x = 0;
                    y += 1;
                    if (y >= scal.y - minCell)
                    {
                    y = (int)scal.y;
                    }
                            }
                        }
                        else findFree = false;
                    }
                    for (int xx = 0; xx < w; xx++)
                        for (int yy = 0; yy < l; yy++)
                        {
                            m[x + xx, y + yy] = 1;
                        }
                    GameObject gr = GameObject.CreatePrimitive(PrimitiveType.Cube);
                    gr.transform.position = new Vector3(sX + x, h*0.5f, sZ + y);
                    gr.transform.localScale = new Vector3(w, h, l) ;
                    gr.name = "house_" + namCount.ToString();
                    houseInfo(gr.transform.position, gr.transform.localScale);
                    namCount += 1;
                    x += w + 1;
                    if(x >= scal.x - minCell)
                    {
                        x = 0;
                        y += 2;
                    }
                }
            }
        

    }
    void houseInfo(Vector3 pos, Vector3 scal)
    {
        int r = Random.Range(0, owner.Length);
        listInfo.Add(r); // владелец
        listInfo.Add(Random.Range(1990, 2000)); // дата построики
        listInfo.Add(((int)scal.y)); // сколько этажей
        listInfo.Add((int)scal.x * (int)scal.z * (int)scal.y * price[r]); // стоимость здания
        listInfo.Add((int)pos.x);
        listInfo.Add((int)pos.y);
        listInfo.Add((int)pos.z);
        listInfo.Add((int)scal.x) ;
        listInfo.Add((int)scal.y);
        listInfo.Add((int)scal.z);
    }
}
drcrackДата: Воскресенье, 16 Февраля 2020, 12:21 | Сообщение # 10
старожил
Сейчас нет на сайте
Этот код выглядит как будто он написан в блокноте на 800х600 мониторе старым дедом с 50-летним опытом программирования на Си и Турбо Паскале
Хотя возможно у чувака в IDE просто платные пробелы, переводы строк и заглавные буквы, вот он и экономит


Сообщение отредактировал drcrack - Воскресенье, 16 Февраля 2020, 12:23
alewДата: Воскресенье, 16 Февраля 2020, 23:13 | Сообщение # 11
уже был
Сейчас нет на сайте
Цитата drcrack ()
дедом с 50-летним опытом программирования на Си

Ты мне льстишь. ^_^
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Город для игры на Unity
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг