Вторник, 09 Августа 2022, 17:44

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: beril  
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » unity как сохранить тереин
unity как сохранить тереин
teramiДата: Воскресенье, 21 Мая 2017, 16:26 | Сообщение # 1
был не раз
Сейчас нет на сайте
всем привет, есть террейн и в игре можно выкапывать ямы, динамически изменять его, как сохранить результат копания? и загрузить его? Пытался использовать set/get.heigs но что то пошло не так

если в игре динамически изменяется террейн то ведь это можно сохранить, но как?

AssetDatabase.CreateAsset(pTerrainData, "Assets" + "/" + "_TerrainData.asset");
ни это, ни то не работает

Terrain terr; //Your terrain

AssetDatabase.CreateAsset(terr.terrainData, "Assets/SavedFileInfo/TerrainData/myTerrain.asset");

пытался сереализировать spat texture, но она не сереализируется,

по идее нужно создать массив с выотами и сохранять его, но как его для начала создать?


Всё мрак, спасенья нет

Сообщение отредактировал terami - Воскресенье, 21 Мая 2017, 16:41
URGINSANДата: Воскресенье, 21 Мая 2017, 17:04 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
terami, а если сохранять и загружать карту высоты динамически?

Я на драйве
teramiДата: Воскресенье, 21 Мая 2017, 17:24 | Сообщение # 3
был не раз
Сейчас нет на сайте
URGINSAN, вот я тоже думал об этом. хотел экспортить рав через скрипт, но не нашел как это сделать, а что насчет сохранять и загружать карту высоты динамически? это через terraindata set/get.Heitgs или что -то не то?

Всё мрак, спасенья нет
EchoITДата: Воскресенье, 21 Мая 2017, 18:23 | Сообщение # 4
старожил
Сейчас нет на сайте
terami, получаешь карту высот через GetHeights, сериализуешь и сохраняешь в файл. Через System.IO. Поскольку AssetDatabase только для редактора вроде. Потом загружаешь из файла, десериализуешь, задаёшь через SetHeights.

Долгожданный анонсик: State of War
teramiДата: Воскресенье, 21 Мая 2017, 19:10 | Сообщение # 5
был не раз
Сейчас нет на сайте
EchoIT пожалуй для начала нужно опубликовать массив высот, то есть вот это
Код
public float[,] GetHeights(int xBase, int yBase, int width, int height);
но если я так сделаю то будет ошибка, если я поменяю get на set то ничего не измениться, тип это всё не имеет тела, что я делаю не так?


Всё мрак, спасенья нет
seamanДата: Воскресенье, 21 Мая 2017, 19:34 | Сообщение # 6
старожил
Сейчас нет на сайте
А Вы отличаете функцию от переменной?
teramiДата: Воскресенье, 21 Мая 2017, 21:45 | Сообщение # 7
был не раз
Сейчас нет на сайте
seaman, а разве она не нужна чтобы вызвать функцию?

Добавлено (21 мая 2017, 21:45)
---------------------------------------------
seaman, то бишь что-то подобное

Код
public Terrain ter;
public TerrainData  terr; // как указать ассет тераина?

    void Start () {
  
  ter.GetHeights();
    }
    
    // Update is called once per frame
    void Update () {
    
    }
}


Всё мрак, спасенья нет

Сообщение отредактировал terami - Воскресенье, 21 Мая 2017, 21:02
EchoITДата: Воскресенье, 21 Мая 2017, 22:55 | Сообщение # 8
старожил
Сейчас нет на сайте
terami, товарищ, я бы на твоём месте сначала досконально прочитал какую-нибудь книгу по C# и справку юнити по скриптам, я уверен, тебе это очень поможет. :)
Просто каждый момент тут вряд ли смогут объяснить.


Долгожданный анонсик: State of War

Сообщение отредактировал EchoIT - Воскресенье, 21 Мая 2017, 22:56
teramiДата: Понедельник, 22 Мая 2017, 16:44 | Сообщение # 9
был не раз
Сейчас нет на сайте
EchoIT, вы безусловно правы, у меня даже пылиться пара книг по программированию: Полный справочник по C# Герберт Шилдт и юнити в действии Джозеф Хонинг, конечно правильно бы начать изучать с# по нормальному, но трудность в том что это долго, а времени у меня мало, конечно в середине лета его станет много, но вот компа не будет, а я полагаю, что пройденный материал надо закреплять,.. Почему бы не помочь с этим скриптом? просто возможность терраформирования и сохранения результатов меня очень сильно заинтересовала, так сильно что я забросил другие наработки по игре, если я смогу реализовать сохранение и загрузку высот, то это было б круто, но есть одно но, и это но - если(

Всё мрак, спасенья нет
EchoITДата: Понедельник, 22 Мая 2017, 17:09 | Сообщение # 10
старожил
Сейчас нет на сайте
terami, дело в том, что тут не такой уж маленький код и его сложно объяснить вот так вот, на форуме. Писать много. Общий алгоритм я уже отписал выше. Get/SetHeights, сериализация, сохранение и загрузка из файлов. Изучите хотя бы это, станет понятнее. :)

Долгожданный анонсик: State of War
teramiДата: Понедельник, 22 Мая 2017, 17:20 | Сообщение # 11
был не раз
Сейчас нет на сайте
EchoIT, а можете ли вы кинуть справку по Get/SetHeights?

Всё мрак, спасенья нет
seamanДата: Понедельник, 22 Мая 2017, 18:11 | Сообщение # 12
старожил
Сейчас нет на сайте
А у Вас что нет доступа к мануалу? Забанили на Юнити?
Ссылку давать не буду - мне тут два раза предупреждение делали и банили за ссылки. Перепечатывать с мануала - идиотизм. Так что ищите сами...
teramiДата: Понедельник, 22 Мая 2017, 19:40 | Сообщение # 13
был не раз
Сейчас нет на сайте
seaman, я рукожоп и единственное что нашел так вот это:
get.heigts
TerrainData.GetHeights
Other Versions
public float[,] GetHeights(int xBase, int yBase, int width, int height);
Parameters

xBase First x index of heightmap samples to retrieve.
yBase First y index of heightmap samples to retrieve.
width Number of samples to retrieve along the heightmap's x axis.
height Number of samples to retrieve along the heightmap's y axis.
Description

Get an array of heightmap samples.

Returns a two dimensional array of heightmap samples. The samples are represented as float values ranging from 0 to 1. The array has the dimensions [height,width] and is indexed as [y,x].


Всё мрак, спасенья нет
EchoITДата: Понедельник, 22 Мая 2017, 21:32 | Сообщение # 14
старожил
Сейчас нет на сайте
terami, а этого мало? :D

Долгожданный анонсик: State of War
teramiДата: Вторник, 23 Мая 2017, 17:29 | Сообщение # 15
был не раз
Сейчас нет на сайте
EchoIT, тут не совсем понятно как использовать Get.heigts, как считать данные высот карты, нужно ли создавать массив?

Всё мрак, спасенья нет

Сообщение отредактировал terami - Вторник, 23 Мая 2017, 18:18
EchoITДата: Вторник, 23 Мая 2017, 19:40 | Сообщение # 16
старожил
Сейчас нет на сайте
terami, в справке тащемта всё написано. Массив двумерный, если память не изменяет, а значение, расположенное по индексам, отвечает за высоту точки от 0 до 1.

Долгожданный анонсик: State of War
teramiДата: Вторник, 23 Мая 2017, 22:01 | Сообщение # 17
был не раз
Сейчас нет на сайте
EchoIT

Код
using UnityEngine;
using System.Collections;

public class TerraiDeformer : MonoBehaviour
{

#region Public members
//This class member is used for Crater texture shape, you have to make sure that the access of the texture is Read/Write. You can find it in the advanced section of the import option when you select the texture.
public Texture2D CraterTexture;
// This class member modifies the intensity of the brush, if you don't introduce this factor, you will get harsh results, or you will not have a control over how hard your terrain is gonna be deformed
public float AlphaIntensity;
//Here you pass the terrain which you want to deform.
public Terrain targetTerrain;
#endregion

#region Private members
private float[,] SavedTerrainState { get; set; } // This class member is used to hold the original data of the terrain
private float[,] craterShape { get; set; } //Since the height map of the terrain is 2D array, and since we are modifying square area of the terrain, we are extracting the gray-scale information from our crater texture, and keeping it to modify the terrain.
// Texture info is a class I made in order to easily cache and manage the crater texture (brushes).
#endregion

void Start () {
// Remember, we are addressing a square map here, so you can imagine that 0,0 is the top left corner of the height map, and the terrain height map width and height are the maximum end points of the square

// Look at the constructor of the TextureInfo

}

void OnCollisionEnter(Collision _colObject)
{
// Here I'm deforming the terrain based on the position of the contact point. It could be a good idea to put a condition to make a certain object with a certain tag can modify the terrain, otherwise, anything which is colliding with the terrain will deform it.

}
void Update () {
if(Input.GetKeyDown(KeyCode.R))

SavedTerrainState = targetTerrain.terrainData.GetHeights(0, 0, targetTerrain.terrainData.heightmapWidth, targetTerrain.terrainData.heightmapHeight);

if(Input.GetKeyDown(KeyCode.E))
targetTerrain.terrainData.SetHeights(0, 0, SavedTerrainState);

}
}


вот тут нашел один пример, но что-то не понятное(


Всё мрак, спасенья нет

Сообщение отредактировал terami - Вторник, 23 Мая 2017, 22:02
EchoITДата: Среда, 24 Мая 2017, 00:43 | Сообщение # 18
старожил
Сейчас нет на сайте
terami, да всё вроде понятно. При нажатии R сохраняет террейн в массив. При нажатии E загружает его из массива. Довольно наглядно.

Долгожданный анонсик: State of War
teramiДата: Среда, 24 Мая 2017, 15:45 | Сообщение # 19
был не раз
Сейчас нет на сайте
EchoIT, так то это работает но
если только не выходить из игры, вот так: выкопал одну яму, сохранился, выкопал вторую яму, загрузил игру вторая яма исчезла
но если вышел из игры, и снова зашел, нажал загрузить игру, то игра крашиться

так-с, так-с, а потом нужно будет сохранить сам массив с сданными высот через сереализацию? но как это сделать? вот тут мне кажется массив не сохраняеться, или по крайней мере не может считать высоты в массиве(
или я как-то не так сохраняю:

Код
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml.Serialization;
using System.IO;
[System.Serializable]
public class Test {
       public float[,] SavedTerrainState { get; set; }
}
public class TerraiDeformer : MonoBehaviour
{

#region Public members
//This class member is used for Crater texture shape, you have to make sure that the access of the texture is Read/Write. You can find it in the advanced section of the import option when you select the texture.
public Texture2D CraterTexture;
// This class member modifies the intensity of the brush, if you don't introduce this factor, you will get harsh results, or you will not have a control over how hard your terrain is gonna be deformed
public float AlphaIntensity;
//Here you pass the terrain which you want to deform.
public Terrain targetTerrain;
#endregion

public float[,] SavedTerrainState { get; set; } // This class member is used to hold the original data of the terrain
private float[,] craterShape { get; set; } //Since the height map of the terrain is 2D array, and since we are modifying square area of the terrain, we are extracting the gray-scale information from our crater texture, and keeping it to modify the terrain.
// Texture info is a class I made in order to easily cache and manage the crater texture (brushes).

void Start () {
// Remember, we are addressing a square map here, so you can imagine that 0,0 is the top left corner of the height map, and the terrain height map width and height are the maximum end points of the square

// Look at the constructor of the TextureInfo

}

void OnCollisionEnter(Collision _colObject)
{
// Here I'm deforming the terrain based on the position of the contact point. It could be a good idea to put a condition to make a certain object with a certain tag can modify the terrain, otherwise, anything which is colliding with the terrain will deform it.

}
void Update () {
  if(Input.GetKeyDown(KeyCode.R))
  
                         SaveParams();
      
      if(Input.GetKeyDown(KeyCode.E))
                         LoadParams();

}

public void SaveParams(){
                var xml = new XmlSerializer (typeof(Test));
                var test = new Test ();

               
                test.SavedTerrainState = SavedTerrainState;

                using (var stream = new FileStream ("Test.xml", FileMode.Create, FileAccess.Write)) {
                        xml.Serialize (stream, test);
                }
  SavedTerrainState = targetTerrain.terrainData.GetHeights(0, 0, targetTerrain.terrainData.heightmapWidth, targetTerrain.terrainData.heightmapHeight);
                Debug.Log ("Объект сохранился");

        }
        public void LoadParams(){
                var xml = new XmlSerializer (typeof(Test));
                var test = new Test ();
                using (var stream = new FileStream ("Test.xml", FileMode.Open, FileAccess.Read)) {
                        test = xml.Deserialize (stream) as Test;
                }

                SavedTerrainState = test.SavedTerrainState;

targetTerrain.terrainData.SetHeights(0, 0, SavedTerrainState);
                Debug.Log ("Объект загружен");
        }

  
}


+ еще одно не понятное как очистить или перезаписать массив?, когда я сохраняю игру второй раз она вылетает с ошибкой: ArgumentException: Array was not a one-dimensional array.


Всё мрак, спасенья нет

Сообщение отредактировал terami - Среда, 24 Мая 2017, 15:57
EchoITДата: Среда, 24 Мая 2017, 16:22 | Сообщение # 20
старожил
Сейчас нет на сайте
terami, ты сначала сохраняешь, а потом уже делаешь GetHeights, поэтому и не работает.
Вот эту строчку
Код
SavedTerrainState = targetTerrain.terrainData.GetHeights(0, 0, targetTerrain.terrainData.heightmapWidth, targetTerrain.terrainData.heightmapHeight);

Кинь в самое начало SaveParams.


Долгожданный анонсик: State of War
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » unity как сохранить тереин
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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