forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Общие вопросы (http://forum.boolean.name/forumdisplay.php?f=166)
-   -   Вопросы от новичка (http://forum.boolean.name/showthread.php?t=15809)

WISHMASTER35 25.11.2012 17:57

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от Nerd96 (Сообщение 244776)
Возможно ли отключить backface culling?

http://docs.unity3d.com/Documentatio...lAndDepth.html

WISHMASTER35 25.11.2012 23:20

Ответ: Вопросы от новичка
 
А как сделать свою сериализацию? А то мои классы не сохраняются.
Т.е. я хочу вручную превращать класс в byte[] и создавать класс и byte[].

pax 26.11.2012 10:50

Ответ: Вопросы от новичка
 
Ну... рефлексия + MemoryStream + BinaryWriter/BinaryReader

is.SarCasm 26.11.2012 20:10

Ответ: Вопросы от новичка
 
Как связать два Toggle, то есть как радио баттон: один включаешь, другой выключается?

pax 26.11.2012 20:29

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от is.SarCasm (Сообщение 244874)
Как связать два Toggle, то есть как радио баттон: один включаешь, другой выключается?

Если текущий поменял значение на true, - пройти по всем кроме текущего и поменять им на false

is.SarCasm 26.11.2012 20:53

Ответ: Вопросы от новичка
 
Как решить проблему с тем что в телефонах высота экрана больше ширины? То есть на компьютере удобней отображать так, а на телефоне всё повернуть( в том числе и ГУИ же)

pax 26.11.2012 21:37

Ответ: Вопросы от новичка
 
Ничего поворачивать не надо, при билде сам выбираешь landskape или portrait. Просто привязать GUI к краям/углам экрана. Конечно можно делать 2 GUI.

WISHMASTER35 26.11.2012 22:47

Ответ: Вопросы от новичка
 
Цитата:

Сообщение от pax (Сообщение 244825)
Ну... рефлексия + MemoryStream + BinaryWriter/BinaryReader

Т.е. вручную рекурсивно получать все public или сериализрванные поля, определять их тип\размер и записывать? Что-то сложно. Должен быть свой сериализатор. В java такой сериализатор точно есть, но его почему-то не любят.

WISHMASTER35 27.11.2012 01:35

Ответ: Вопросы от новичка
 
Не знаю какой сериализатор в юнити, но System.Runtime.Serialization отлично сохраняет и восстанавливает классы не зная их типа.
В Unity сохраняется только по типу ссылки. Т.е. если ссылка MonoBehaviour, то ни черта не сохранит, даже если в эту ссылку будет записан объект с кучей инфы(
Пример просто на C#, но надеюсь Mono тоже поддерживает.
Код:

        private static byte[] Serialize(object obj)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            bf.Serialize(stream, obj);
            stream.Close();
            return stream.ToArray();
        }
        private static object Deserialize(byte[] array)
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream(array);
            object obj = bf.Deserialize(stream);
            stream.Close();
            return obj;
        }

Только, если десириализацию(восстановление) делать в OnEnable можно, то когда сериализацию делать? Проверять в Editor'е, если объект Dirty, то сохранить его?

pax 27.11.2012 07:15

Ответ: Вопросы от новичка
 
Mono поддерживает, но оно не применимо к объектам Unity. Ни одной ссылки на ресурсы в рантайме сохранить если явно не знать как получить объект из ресурса. К тому же как сохранять и восстанавливать компоненты, которые добавляются через AddComponent() и GetComponent()? Так что только вручную и с помощью своего менеджера ресурсов, "знающего" как воссоздать тот или иной объект (хранящий пути для Resource.Load или непосредственно ссылки на объекты) и "знающий", какой объект как создан (т.е. вероятнее всего придется либо создавать все объекты и через этот менеджер, либо на объекты вешать специальный компонент, содержащий информацию для сериализации).

WISHMASTER35 27.11.2012 20:41

Ответ: Вопросы от новичка
 
Забыл написать, у меня задача проще. Мои классы - не скрипты.
Если помнишь я делал свой MineCraft. Там есть два типа блоков: Cube и Cross(трава). Оба они наследуют один класс Block. Но списки сейчас приходится делать для каждого типа. Вот хочу, чтобы хватало одного List<Block> blockSet.

Хотя, наверно было бы лучше использовать XML, но я так и не разобрался как для него делать инспектор. Если инспектор для TextAsset сделать, то он будет для всех левых форматов.
И еще не понятно как в XML хранить путь к объектам\ассетам. Наверно можно хранить их ID, а сами объекты хранить в папке Resources. Или напрямую пусть к файлу.
Просто еще хочется сделать, чтобы BlockSet с текстурами мог грузится из проекта и из вне проекта.

pax 28.11.2012 14:01

Ответ: Вопросы от новичка
 
По сериализации у нас Dream писал урок http://forum.boolean.name/showthread.php?t=12638

pie 01.12.2012 09:14

Ответ: Вопросы от новичка
 
Вложений: 2
Всем привет! Возник такой вопрос. Как сделать круглый бесконечный рандомный тоннель. Под рандомностью понимается смещение центра окружности. Видно на скриншотах. Я могу нарисовать окружность и смещать его центр относительно какой то величины рандомом. Но как формировать поверхность между 1-ой и второй окружностью.
Спасибо за внимание.

RegIon 01.12.2012 10:32

Ответ: Вопросы от новичка
 
http://blog.nobel-joergensen.com/201...mesh-in-unity/
http://gamesmaker.ru/programming/dir...trianglestrip/

Окружность - многоугольник с огромным числом рёбер(векторное представление)
А потом что-то типо такого:
PHP код:

public int SegmentCount=8;
public 
Vector3[] Centers={new Vector3(0,0,0)};
public 
float Distance=1f;

void Make(){

    
MeshFilter meshFilter GetComponent();
    if (
meshFilter==null){
        
Debug.LogError("MeshFilter not found!");
        return;
    }

    
Vector3[] = new Vector3[SegmentCount*Centers.Lenght];
    
int[] t=new int[SegmentCount*(Centers.Lenght-1)*3];
           for(
int j=0;j<Centers.Lenght;j++){
                for(
int i=0;i<SegmentCount;i++)
                    {
                        
v[i+SegmentCount*j]= Centers[j] + new Vector(j*Distance,Mathf.Sin((i*360f*Mathf.GradToDeg)/SegmentCount),Mathf.Cos((i*360f*Mathf.GradToDeg)/SegmentCount));
                        
//тут нужно придумать удобное заполнение массива треугольников
                    
}
           }
    
//не уверен что будет нормально работать
    
Mesh mesh meshFilter.sharedMesh;
    
mesh.Clear();

    
mesh.vertices v;
    
mesh.triangles t;

    
mesh.RecalculateNormals();
    
mesh.RecalculateBounds();
    
mesh.Optimize();



WISHMASTER35 02.12.2012 00:08

Ответ: Вопросы от новичка
 
Интересно ваше мнение. Если нужно сделать GUI с анимационными кнопка, красивой сменой экранов(допустим, чтобы одни элементы улетали в одну сторону, а с другой стороны прилетали другие) и подобными эффектами, то как лучше сделать такое?
Я сейчас для каждого элемента делаю свой GameObject и на нем проигрывал анимации или просто смещаю его, а сам элемент рисуется, через GUILayout, но смещается\масштабируется в зависит от трансформации.
Но GameObject для каждого элемента не супер. Как бы вы это сделали?

Код:

public enum ScaleType {
        ByWidth,
        ByHeight,
        ByWidthAndHeight,
        ByAverageSize,
        ByMinSize,
        ByMaxSize
}

public abstract class GUIComponent : MonoBehaviour {
       
        [SerializeField] private ScaleType scaleType = ScaleType.ByAverageSize;
        [SerializeField] private float scale = 50;
        [SerializeField] private float border = 5;
        protected bool pressedDown = false;
        private bool process = false;
       
        public abstract bool Draw();
       
        protected virtual void Update() {
                if(pressedDown) process = true;
        }
       
        protected Rect GetRect(GUIContent content) {
                float borderX = border * GetScaleX() / 100f;
                float borderY = border * GetScaleY() / 100f;
               
                Vector2 size = GUI.skin.button.CalcSize(content);
                float aspect = size.x/size.y;
                if(scaleType == ScaleType.ByWidthAndHeight) aspect = 1f;
               
                float w = GetScaleX() * scale / 100f * aspect;
                float h = GetScaleY() * scale / 100f;
               
                Rect rect = GUILayoutUtility.GetRect( w+borderX*2, h+borderY*2, GUILayout.ExpandWidth(false) );
                rect.x += borderX;
                rect.y += borderY;
                rect.width -= borderX*2;
                rect.height -= borderY*2;
               
                Vector2 center = rect.center;
                rect.width *= transform.lossyScale.x;
                rect.height *= transform.lossyScale.y;
                rect.center = center;
                return rect;
        }
       
        private float GetScaleX() {
                switch(scaleType) {
                        case ScaleType.ByWidth : return Screen.width;
                        case ScaleType.ByHeight : return Screen.height;
                        case ScaleType.ByAverageSize : return (Screen.width+Screen.height)/2f;
                        case ScaleType.ByMinSize : return Mathf.Min(Screen.width, Screen.height);
                        case ScaleType.ByMaxSize : return Mathf.Max(Screen.width, Screen.height);
                        case ScaleType.ByWidthAndHeight : return Screen.width;
                }
                return 0f;
        }
       
        private float GetScaleY() {
                switch(scaleType) {
                        case ScaleType.ByWidth : return Screen.width;
                        case ScaleType.ByHeight : return Screen.height;
                        case ScaleType.ByAverageSize : return (Screen.width+Screen.height)/2f;
                        case ScaleType.ByMinSize : return Mathf.Min(Screen.width, Screen.height);
                        case ScaleType.ByMaxSize : return Mathf.Max(Screen.width, Screen.height);
                        case ScaleType.ByWidthAndHeight : return Screen.height;
                }
                return 0f;
        }
       
        public bool IsPressedDown() {
                return pressedDown;
        }
       
        public bool IsProcess() {
                bool end = process && !animation.isPlaying;
                if(end) process = false;
                return end;
        }
       
}

public class GUIButton : GUIComponent {
       
        public string text;
       
        public override bool Draw() {
                Rect rect = GetRect( new GUIContent(text) );
                return pressedDown = GUI.Button(rect, text);
        }
       
}



Часовой пояс GMT +4, время: 12:55.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot