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)

pax 28.12.2012 15:07

Ответ: Вопросы от новичка
 
1. Объект на котором висит скрипт - префаб в Project, а назначаемый GO в сцене.
2. Назначенный ГО убивается до срабатывания функции Start

стоп, недочитал код.

Ты забыл Tr = new Tr[Ob.Length];

Morganolla 28.12.2012 16:22

Ответ: Вопросы от новичка
 
Ммм, не совсем понятно... Я прямо делаю на сцене пустой объект. Он у меня появляется в окне Иерархий. Добавляю в него чилды ( меши ) из Проекта. Делаю новый скрипт ( он есествено в Проекте ) и вешаю его на этот пустой родительский объект. В скрипте у меня массив ссылок на чилды, который я мышкой и распихиваю.
Так вот при запуске сцены этот массив обнуляется!!! А если я сделаю не массив, а просто перечень ссылок - они не обнуляются!!! Почему? Это так всегда?

Кажется все само собой ИСПРАВИЛОСЬ и ЗАРАБОТАЛО... Теперь массив не обнуляется... Рах, спасибо тебе все равно... Префаб вроде не причем... просто какой то глюк...

Morganolla 29.12.2012 14:56

Ответ: Вопросы от новичка
 
Нубский вопрос скорее по С#:
Если создаем не публичный массив в классе типа:
GameObject [] x; или
Renderer [] x; или
Transform [] x;

то как задать его размер???
Если он публичный, то можно задать в инспекторе...

В С++ просто объявляется массив объектов с заданной размерностью , например : GameObject x[5] ; а здесь?


ЗЫ Похоже все проблемы по предыдущим вопросам были из-за того что массив Transform был не публичным и без определения его размера!

Ага, Рах, похоже ты уже ответил... :)

WISHMASTER35 29.12.2012 16:06

Ответ: Вопросы от новичка
 
А в Unity можно делать распараллеливание алгоритмов?
На с++ OpenMP довольно удобная штука, но там все на директивах работает.
Видел для C# как два метода как-то записывают в массив и передают его куда-то, чтобы методы из массива выполнились на всех ядрах. Но не помню где это видел.

pie 29.12.2012 18:04

Ответ: Вопросы от новичка
 
Всем привет! У меня вопрос по поводу системы Mecanim в Unity3D 4. Делал все вот по этому туториалу:
http://www.youtube.com/watch?v=Xx21y9eJq1U
Вроде бы все нормально. Но вот интересует вопрос как можно реализовать стрейфы (движение в бок)?

pie 29.12.2012 22:21

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

Переменные:

Переход SideRun -> ForwardRun:


Возникла проблема в том что не могу настроить переход ForwardRun -> SideRun. Кто может подсказать?

Код проигрывания анимации:
Код:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof (Animator))]
[RequireComponent(typeof (CapsuleCollider))]
[RequireComponent(typeof (Rigidbody))]
public class AnimationController : MonoBehaviour {
        public float animSpeed = 1.5f;
        public float lookSmoother = 3f;
        public bool useCurves;

       
        private Animator anim;
        private AnimatorStateInfo currentBaseState;
        private AnimatorStateInfo layer2CurrentState;
        private CapsuleCollider col;
        private float h;
        private float s;
       
        public void Start () {
                anim = GetComponent<Animator>();                                         
                col = GetComponent<CapsuleCollider>();
        }
       
        public void FixedUpdate () {
               
                var A = Input.GetKey(KeyCode.A);
                var D = Input.GetKey(KeyCode.D);
                float target = 0;
               
                if(A != D)
                        target = A?-1:1;
                                                       
                h = Mathf.SmoothDamp(h, target, ref s, 0.1f);
                //float h = Input.GetAxis("Horizontal");
                float v = Input.GetAxis("Vertical");
               
                if (v != 0) {
                        anim.SetFloat("Speed", v);                                                       
                        anim.SetFloat("Direction", h);
                }else{
                        anim.SetFloat("SideSpeed", Mathf.Abs(h));                                                       
                        anim.SetFloat("Direction", h);
                }
                anim.speed = animSpeed;
        }
}


pax 29.12.2012 22:55

Ответ: Вопросы от новичка
 
Кроме как спросить почему логика анимаций в FixedUpdate, а не в Update я ничего не могу сказать. Четвертую Unity некогда смотреть пока.

pie 30.12.2012 22:24

Ответ: Вопросы от новичка
 
Всем привет! Кто работал с CharacterController помогите пожалуйста.
Есть 4 вида анимации движения: вперед, назад, влево, вправо.
Есть скрипты управления:
Код:

using UnityEngine;
using System.Collections;

public class PlatformCharacterController : MonoBehaviour {
       
        private CharacterMotor motor;
       
        public float walkMultiplier = 0.5f;
        public bool defaultIsWalk = false;
       
        // Use this for initialization
        void Start () {
                motor = GetComponent(typeof(CharacterMotor)) as CharacterMotor;
                if (motor==null) Debug.Log("Motor is null!!");
        }
       
        // Update is called once per frame
        void Update () {
                // Get input vector from kayboard or analog stick and make it length 1 at most
                Vector3 directionVector = new Vector3(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), 0);
                if (directionVector.magnitude > 1) directionVector = directionVector.normalized;
                directionVector = directionVector.normalized * Mathf.Pow(directionVector.magnitude, 2);
               
                // Rotate input vector into camera space so up is camera's up and right is camera's right
                directionVector = Camera.main.transform.rotation * directionVector;
               
                // Rotate input vector to be perpendicular to character's up vector
                Quaternion camToCharacterSpace = Quaternion.FromToRotation(Camera.main.transform.forward*-1, transform.up);
                directionVector = (camToCharacterSpace * directionVector);
               
                // Make input vector relative to Character's own orientation
                directionVector = Quaternion.Inverse(transform.rotation) * directionVector;
               
                if (walkMultiplier != 1) {
                        if ((Input.GetKey("left shift") || Input.GetKey("right shift")) != defaultIsWalk) {
                                directionVector *= walkMultiplier;
                        }
                }
               
                // Apply direction
                motor.desiredMovementDirection = directionVector;
        }
}

Код:

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(CharacterController))]
public class NormalCharacterMotor : CharacterMotor {
       
        public float maxRotationSpeed = 270;
       
        private bool firstframe = true;
       
        private void OnEnable () {
                firstframe = true;
        }
       
        private void UpdateFacingDirection() {
                // Calculate which way character should be facing
                float facingWeight = desiredFacingDirection.magnitude;
                Vector3 combinedFacingDirection = (
                        transform.rotation * desiredMovementDirection * (1-facingWeight)
                        + desiredFacingDirection * facingWeight
                );
                combinedFacingDirection = Util.ProjectOntoPlane(combinedFacingDirection, transform.up);
                combinedFacingDirection = alignCorrection * combinedFacingDirection;
               
                if (combinedFacingDirection.sqrMagnitude > 0.01f) {
                        Vector3 newForward = Util.ConstantSlerp(
                                transform.forward,
                                combinedFacingDirection,
                                maxRotationSpeed*Time.deltaTime
                        );
                        newForward = Util.ProjectOntoPlane(newForward, transform.up);
                        //Debug.DrawLine(transform.position, transform.position+newForward, Color.yellow);
                        Quaternion q = new Quaternion();
                        q.SetLookRotation(newForward, transform.up);
                        transform.rotation = q;
                }
        }
       
        private void UpdateVelocity() {
                CharacterController controller = GetComponent(typeof(CharacterController)) as CharacterController;
                Vector3 velocity = controller.velocity;
                if (firstframe) {
                        velocity = Vector3.zero;
                        firstframe = false;
                }
                if (grounded) velocity = Util.ProjectOntoPlane(velocity, transform.up);
               
                // Calculate how fast we should be moving
                Vector3 movement = velocity;
                //bool hasJumped = false;
                jumping = false;
                if (grounded) {
                        // Apply a force that attempts to reach our target velocity
                        Vector3 velocityChange = (desiredVelocity - velocity);
                        if (velocityChange.magnitude > maxVelocityChange) {
                                velocityChange = velocityChange.normalized * maxVelocityChange;
                        }
                        movement += velocityChange;
               
                        // Jump
                        if (canJump && Input.GetButton("Jump")) {
                                movement += transform.up * Mathf.Sqrt(2 * jumpHeight * gravity);
                                //hasJumped = true;
                                jumping = true;
                        }
                }
               
                // Apply downwards gravity
                movement += transform.up * -gravity * Time.deltaTime;
               
                if (jumping) {
                        movement -= transform.up * -gravity * Time.deltaTime / 2;
                }
               
                // Apply movement
                CollisionFlags flags = controller.Move(movement * Time.deltaTime);
                grounded = (flags & CollisionFlags.CollidedBelow) != 0;
        }
       
        // Update is called once per frame
        void Update () {
                UpdateFacingDirection();
               
                UpdateVelocity();
        }
}

Код:

using UnityEngine;
using System.Collections;

public abstract class CharacterMotor : MonoBehaviour {
       
        public float maxForwardSpeed = 1.5f;
        public float maxBackwardsSpeed = 1.5f;
        public float maxSidewaysSpeed = 1.5f;
        public float maxVelocityChange = 0.2f;
       
        public float gravity = 10.0f;
        public bool canJump = true;
        public float jumpHeight = 1.0f;
       
        public Vector3 forwardVector = Vector3.forward;
        protected Quaternion alignCorrection;
       
        private bool m_Grounded = false;
        public bool grounded {
                get { return m_Grounded; }
                protected set { m_Grounded = value; }
        }
       
        private bool m_Jumping = false;
        public bool jumping        {
                get { return m_Jumping; }
                protected set { m_Jumping = value; }
        }
       
        private Vector3 m_desiredMovementDirection;
        private Vector3 m_desiredFacingDirection;
       
        void Start () {
                alignCorrection = new Quaternion();
                alignCorrection.SetLookRotation(forwardVector, Vector3.up);
                alignCorrection = Quaternion.Inverse(alignCorrection);
        }
       
        public Vector3 desiredMovementDirection {
                get { return m_desiredMovementDirection; }
                set {
                        m_desiredMovementDirection = value;
                        if (m_desiredMovementDirection.magnitude>1) m_desiredMovementDirection = m_desiredMovementDirection.normalized;
                }
        }
        public Vector3 desiredFacingDirection {
                get { return m_desiredFacingDirection; }
                set {
                        m_desiredFacingDirection = value;
                        if (m_desiredFacingDirection.magnitude>1) m_desiredFacingDirection = m_desiredFacingDirection.normalized;
                }
        }
        public Vector3 desiredVelocity {
                get {
                        //return m_desiredVelocity;
                        if (m_desiredMovementDirection==Vector3.zero) return Vector3.zero;
                        else {
                                float zAxisEllipseMultiplier = (m_desiredMovementDirection.z>0 ? maxForwardSpeed : maxBackwardsSpeed) / maxSidewaysSpeed;
                                Vector3 temp = new Vector3(m_desiredMovementDirection.x, 0, m_desiredMovementDirection.z/zAxisEllipseMultiplier).normalized;
                                float length = new Vector3(temp.x, 0, temp.z*zAxisEllipseMultiplier).magnitude * maxSidewaysSpeed;
                                Vector3 velocity = m_desiredMovementDirection * length;
                                return transform.rotation * velocity;
                        }
                }
        }
}

Так вот. Как можно сделать чтобы анимации воспроизводились в нужное время. То есть если двигаемся в бок, то воспроизводиться анимация движения в бок и тд. Пытался разобраться в скрипте AngryBots - безуспешно. Спасибо.

Okay 31.12.2012 00:15

Ответ: Вопросы от новичка
 
А не легче свой скрипт написать?

mepihin 31.12.2012 01:15

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

Сообщение от pie (Сообщение 247943)
Так вот. Как можно сделать чтобы анимации воспроизводились в нужное время. То есть если двигаемся в бок, то воспроизводиться анимация движения в бок и тд. Пытался разобраться в скрипте AngryBots - безуспешно. Спасибо.

Смотри, проверь нажатие на клавишу D и A, далее проигрывай анимацию CrossFade, ну если какие-то баги, то проверь на проигрывание другой анимации и отключи проигрование той взамен на новую

pax 31.12.2012 01:36

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

Сообщение от mepihin (Сообщение 247957)
Смотри, проверь нажатие на клавишу D и A, далее проигрывай анимацию CrossFade, ну если какие-то баги, то проверь на проигрывание другой анимации и отключи проигрование той взамен на новую

Тут проблема в том, что игрок при нажатии A может бежать влево на экране, но повернут в эту сторону задом. Почти решили проблему в аське.

WISHMASTER35 31.12.2012 21:30

Ответ: Вопросы от новичка
 
Грубо говоря надо сравнить вектор движения и вектор направления.
Вот так:
Код:

                float dotZ = Vector3.Dot(transform.forward, moveDir);
                float dotX = Vector3.Dot(transform.right, moveDir);
                if( Mathf.Abs(dotZ) > Mathf.Abs(dotX) ) {
                        if(dotZ > 0) PlayRun(shoot);
                        else PlayRunBackward(shoot);
                } else {
                        if(dotX > 0) PlayRunRight(shoot);
                        else PlayRunLeft(shoot);
                }


WISHMASTER35 01.01.2013 00:51

Ответ: Вопросы от новичка
 
Кто-нибудь делал в GUI свои анимации?
Хочу сделать, чтобы при смене меню, старое меню уменьшалось, сдвигалось в сторону и становилось прозрачным. Так кажется на айфонах видел.
Пытался через GUI.matrix сделать, но не получилось. Если менять у матрицы просто масштаб, то не только размеры элементов умножатся на масштаб, но и позиции. Вообщем не понял как масштабировать относительно центра gui элемента или центра нескольких элементов.

pax 01.01.2013 11:30

Ответ: Вопросы от новичка
 
Имхо стандартный GUI для такого не предназначен

is.SarCasm 01.01.2013 18:19

Ответ: Вопросы от новичка
 
Как сделать дополнение к редактору, чтобы было окошко с двумя строчками (высота, ширина) и кнопка "ок". По нажатию создается много кубиков. Как рисовать это меню? Как назначить префаб "куба" ?
P.S. Нет, не майнкрафт

pax 01.01.2013 18:40

Ответ: Вопросы от новичка
 
Расширение редактора (Часть 2)

WISHMASTER35 02.01.2013 03:56

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

Сообщение от pax (Сообщение 248016)
Имхо стандартный GUI для такого не предназначен

Да если бы разобраться с той чертовой матрицей, то можно было бы сделать.

Morganolla 02.01.2013 15:32

Ответ: Вопросы от новичка
 
Как сделать вывод для отладки некоторых переменных в скрипте ( типа float) при проигрывании сцены? Сделать что-то из ГУИ самопальное?

pax 02.01.2013 15:33

Ответ: Вопросы от новичка
 
Имхо да. Есть еще возможность перехватывать лог: http://docs.unity3d.com/Documentatio...gCallback.html

Morganolla 02.01.2013 16:10

Ответ: Вопросы от новичка
 
Спасибо, Рах. Пока исхитрился по простому - сделал в классе фиктивные публичные переменные, присваивал их и смотрел их в инспекторе...)

pax 02.01.2013 16:22

Ответ: Вопросы от новичка
 
Зачем фейковые? Есть же режим дебага инспектора, он и приватные переменные в редакторе показывает.

is.SarCasm 02.01.2013 21:14

Ответ: Вопросы от новичка
 
Как выводить сообщения из Debug.log на экран?

pax 03.01.2013 07:08

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

Сообщение от is.SarCasm (Сообщение 248109)
Как выводить сообщения из Debug.log на экран?

Яж в 915-ом посте дал ссылку

is.SarCasm 03.01.2013 18:31

Ответ: Вопросы от новичка
 
Мне нужно чтобы в зависимости от переменной некоторые объекты меняли свою гамму (цвет). Есть идеи? Думал может на эти объекты надеть шейдер, но тогда их всех перебирать придется...

WISHMASTER35 03.01.2013 19:45

Ответ: Вопросы от новичка
 
is.SarCasm, если цвет всем одинаковый задавать, то ничего перебирать не надо, ведь материал будет один.

is.SarCasm 03.01.2013 20:04

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

is.SarCasm, если цвет всем одинаковый задавать, то ничего перебирать не надо, ведь материал будет один.
В смысле? Ну вот есть белый и красный кубы. Мне нужно эти два куба затемнить без перебора.

pax 03.01.2013 21:16

Ответ: Вопросы от новичка
 
Шейдер с глобальным параметром тебе поможет

WISHMASTER35 05.01.2013 00:32

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

Сообщение от pax (Сообщение 248209)
Шейдер с глобальным параметром тебе поможет

Только если изначально цвета его кубов заданы в вершинах меша.
Еще можно через RenderSettings.ambientlight, но это уже изврат.

pax 05.01.2013 00:34

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

Сообщение от WISHMASTER35 (Сообщение 248321)
Только если изначально цвета его кубов заданы в вершинах меша.

Не понял к чему это?

WISHMASTER35 05.01.2013 01:12

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

Ну вот есть белый и красный кубы. Мне нужно эти два куба затемнить без перебора.
Если белый и красный будут заданы тоже в шейдере, то это будут разные материалы и сразу все объекты не затемнишь.

pax 05.01.2013 01:16

Ответ: Вопросы от новичка
 
Прочитай справку про глобальные параметры сначала прежде чем делать такие выводы. А еще прочитай вопрос еще раз. У шейдера есть параметр цвета или текстура, есть глобальный параметр затемнения - применяем затемнение - профит.

WISHMASTER35 05.01.2013 01:45

Ответ: Вопросы от новичка
 
pax, Не знал, что так можно. Видно _Time так и задается всем шейдерам.

Я тут немного gui изучаю. GUI.Button возвращает TRUE при событие used. Но used значит что событие было уже использовано. Но как понять какое событие было?
Кстати, если делать так pressed = GUI.Button, то в Update на пк можно использовать pressed, а на андроиде нельзя т.к. всегда false. Видно на андроиде еще раз какое-то событие вызывается и затирает эту переменную.

WISHMASTER35 05.01.2013 03:40

Ответ: Вопросы от новичка
 
Делаю игру три в ряд. Хочу сделать более интересное падение диамантов. Т.е. чтобы при падении у нижнего диаманта скорость была выше, чем у верхних и он отрывался от верхних.
Сейчас скорость вычисляю просто
speed += 22*Time.deltaTime;
speed = Mathf.Clamp(speed, 4, 12);
А дальше соответственно
position.y -= speed*Time.deltaTime;

Но нужно как-то сделать, чтобы чем больше уже скорость, тем больше она увеличивалась. Либо уже в position.y -= speed как-то увеличить скорость.
Как такое можно сделать?

Okay 05.01.2013 06:03

Ответ: Вопросы от новичка
 
Не пойму вот как сделать, чтобы каждый объект тянул к себе персонажа. уже много чего перепробовал, получалось только, что персонаж спиной к объекту тянется

pax 05.01.2013 12:05

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

Сообщение от WISHMASTER35 (Сообщение 248336)
Делаю игру три в ряд. Хочу сделать более интересное падение диамантов. Т.е. чтобы при падении у нижнего диаманта скорость была выше, чем у верхних и он отрывался от верхних.

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

RegIon 05.01.2013 14:50

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

Сообщение от Okay (Сообщение 248352)
Не пойму вот как сделать, чтобы каждый объект тянул к себе персонажа. уже много чего перепробовал, получалось только, что персонаж спиной к объекту тянется

чет типо :
Код:

gameObject box;
var vect=(tansform.position-box.transform.position)*100000f;
rigidbody.addForce(vect);


WISHMASTER35 05.01.2013 18:09

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

Начни перемещать каждого верхнего на долю секунды позже. Получится что-то типа обвала.
А еще лучше каждому следующему падающему диаманту задавать меньшую начальную скорость.
Код:

                for(int x=0; x<Map.width; x++) {
                        float startSpeed = 4;
                        for(int y=0; y<Map.height; y++) {
                                Fruit fruit = map.Get(x, y);
                                if(fruit != null && fruit.IsCanFall()) {
                                        float floorY = GetFloorY(x, fruit.position.y);
                                        bool fall = fruit.Fall(floorY, startSpeed);
                                        if(fall) startSpeed *= 0.5f;
                                }
                        }
                }

Вот так http://dl.dropbox.com/u/55489242/Dia...WebPlayer.html

pie 06.01.2013 15:17

Ответ: Вопросы от новичка
 
Как перенести статистику которая отображается в редакторе (FPS, количество вертекстов, количество текстур и их размер и тд.) на экран в билде?

is.SarCasm 06.01.2013 18:17

Ответ: Вопросы от новичка
 
Почему Time.TimeScale не влияет на анимацию? (использую Меканим)

pax 06.01.2013 18:22

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

Сообщение от pie (Сообщение 248483)
Как перенести статистику которая отображается в редакторе (FPS, количество вертекстов, количество текстур и их размер и тд.) на экран в билде?

Никак, только FPS можешь посчитать.

pie 06.01.2013 19:03

Ответ: Вопросы от новичка
 
А я его правильно подсчитал (увидел на каком то форуме)?
Код:

var fps = 1.0f / Time.deltaTime;
И еще один вопрос. В скрипте я использовал UnityEditor;
При компиляции проекта пишет ошибку: The type or namespace name `UnityEditor' could not be found. Are you missing a using directive or an assembly reference?
Но все работает в редакторе.

pax 06.01.2013 19:32

Ответ: Вопросы от новичка
 
UnityEditor можно использовать, если поместить скрипт в папку Editor. Ну и собственно это скрипт только для редактора.

По поводу FPS - если ты не меняешь timescale, то правильно.

WISHMASTER35 07.01.2013 02:39

Ответ: Вопросы от новичка
 
Как в окнах иерархии сцены и проекта рисуются список? Можно такой нарисовать?
Сам список рисуется как лейбы. Но вот как синюю полоску но всю длину окна нарисовать не пойму. Т.е. не пойму как узнать размер текущей области.

pax 07.01.2013 02:53

Ответ: Вопросы от новичка
 
Имхо элементарно
PHP код:

GUILayout.BeginHorizontal(MyBlueStyle);
GUILayout.Label("MyLabelOnBlueBackground");
GUILayout.EndHorizontal(); 


WISHMASTER35 07.01.2013 03:03

Ответ: Вопросы от новичка
 
Тогда нужно будет текстурой фон задавать. Не хочу возится с текстурой.
Неужели нету способа узнать размер доступной области?

pax 07.01.2013 03:16

Ответ: Вопросы от новичка
 
А если будет доступная область, то как не текстурой? Да и создать текстуру программно пару пустяков.

WISHMASTER35 07.01.2013 03:19

Ответ: Вопросы от новичка
 
Нарисовать прямоугольник можно так
Код:

        private static void FillRect(Rect rect, Color color) {
                if(Event.current.type != EventType.Repaint) return;
               
                Vector3 a = new Vector3(rect.xMin, rect.yMin, 0);
                Vector3 b = new Vector3(rect.xMax, rect.yMin, 0);
                Vector3 c = new Vector3(rect.xMax, rect.yMax, 0);
                Vector3 d = new Vector3(rect.xMin, rect.yMax, 0);
                Vector3[] verts = new Vector3[] {
                        a, b, c, d
                };
               
                Handles.DrawSolidRectangleWithOutline( verts, color, new Color(0,0,0,0));
        }

Хотя этот способ почему-то сейчас впервые странно себя повел. Задаю белый цвет, а он зеленым рисует. Остальные цвета вообще черным рисует.

Написал такую фигню
Код:

                        if( GUILayout.Button(name, GUI.skin.label, GUILayout.ExpandWidth(true)) ) {
                                if(selected != i) GUIUtility.keyboardControl = 0;
                                selected = i;
                        }
                        if(i == selected) {
                                Rect rect = GUILayoutUtility.GetLastRect();
                                FillRect(rect, Color.white);
                        }

Но прямоугольник рисуется после текста и закрашивает его(

Если все же свой стиль создавать для этого, то есть пару вопросов.
Нужно новый GUISkin создавать? В новом скине можно будет изменить только дефолтные стили(label, box, button и др) или можно свои добавить? Как потом в Editor этот скин загрузить?

pax 07.01.2013 03:30

Ответ: Вопросы от новичка
 
имхо мой пример самый простой и рабочий

WISHMASTER35 07.01.2013 03:35

Ответ: Вопросы от новичка
 
В твоем примере все равно надо создавать стиль. Я даже не знаю как в Editor загрузить свой стиль.

pax 07.01.2013 11:31

Ответ: Вопросы от новичка
 
Мне уже смешно)
PHP код:

static GUIStyle _myBlueStyle
public static GUIStyle MyBlueStyle
{
   
get
   
{
       if(
_myBlueStyle)
       {
           
_myBlueStyle = new GUIStyle();
           var 
blueTex = new Texture2D(4,4,TextureFormat.ARGB32false);
           var 
pixels blueTex.GetPixels();
           for (
int i 0pixels.Lengthi++)
           {
               
pixels[i] = new Color(0,0,1,0.75f);
           }
           
blueTex.SetPixels(pixels);
           
_myBlueStyle.normal.background blueTex;
       } 
       return 
_myBlueStyle;
   }


А вот тебе пример загрузки ресурсов для редактора http://answers.unity3d.com/questions...editorgui.html

WISHMASTER35 07.01.2013 17:11

Ответ: Вопросы от новичка
 
Вложений: 1
Вот более путевые строки
Код:

                        Rect rect = GUILayoutUtility.GetRect( new GUIContent(name), normal, GUILayout.ExpandWidth(true) );
                        if(i == selected) FillRect(rect, Color.green);
                        if(GUI.Button(rect, name, normal)) {
                                if(selected != i) GUIUtility.keyboardControl = 0;
                                selected = i;
                        }

Все бы хорошо, но что за бред с Handles.DrawSolidRectangleWithOutline! Сразу после компиляции он еще выдает правильный цвет, но после первой перерисовки снова черным рисует. Странно, но в другом проекте работает.
Может есть где-то матрица трансформации цвета?

UPDATE:
Понял почему не работал Handles.DrawSolidRectangleWithOutline. Нужно было еще и Handles.color задать.
Впрочем все равно почему-то прямоугольник рисуется темнее, чем должен.

Вот код рисования списка
Код:

                        Rect rect = GUILayoutUtility.GetRect( new GUIContent(name), style, GUILayout.ExpandWidth(true) );
                        if(i == selected) {
                                Color blue = new Color( 61/255f, 128/255f, 223/255f );
                                FillRect(rect, blue);
                        }
                       
                        GUI.Label(rect, name, style);
                       
                        if(Event.current.type == EventType.MouseDown && rect.Contains(Event.current.mousePosition)) {
                                if(selected != i) GUIUtility.keyboardControl = 0;
                                Event.current.Use();
                                selected = i;
                        }


WISHMASTER35 07.01.2013 19:45

Ответ: Вопросы от новичка
 
Написал методы расширения для структуры Matrix4x4. Вроде и все работает, но матрица не изменяется.
Код:

        public static void SetPosition(this Matrix4x4 matrix, Vector3 position) {
                matrix.m03 = position.x;
                matrix.m13 = position.y;
                matrix.m23 = position.z;
        }

Что-то не так?

pax 07.01.2013 21:42

Ответ: Вопросы от новичка
 
ты изменяешь матрицу, но не возвращаешь ее туда, откуда взял

Morganolla 08.01.2013 13:21

Ответ: Вопросы от новичка
 
Вопрос- можно ли при одевании текстуры на спрайт сделать ее зеркальное отражение по оси Х или У ( типа ф-ии 'flip')

cahekp 08.01.2013 14:23

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

Сообщение от Morganolla (Сообщение 248653)
Вопрос- можно ли при одевании текстуры на спрайт сделать ее зеркальное отражение по оси Х или У ( типа ф-ии 'flip')

В материале у каждой текстуры есть свой Tiling и Offset.
Если Tiling по x изменить на -1, то изображение горизонтально отразится. Если изменить по y на -1, то, соответственно, отразится вертикально.

mauNgerS 08.01.2013 22:07

Ответ: Вопросы от новичка
 
Доброго времени суток.

Подскажите пожалуйста, как на юнити сделать такую манипуляцию

PHP код:

hmap=LoadImage("Media\levelrts11.bmp")

SetBuffer(ImageBuffer(hmap))
For 
z=0 To grid
    
For x=0 To grid
        GetColor x
,z
        map
(x,z)=ColorRed()
    
Next
Next
SetBuffer BackBuffer
() 


WISHMASTER35 08.01.2013 22:51

Ответ: Вопросы от новичка
 
mauNgerS, для загрузки текстуры просто сделай public Texture2D tex переменную и назначь ей значение в инспекторе. Остальное не понял.

Цитата:

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

Вот еще проблема с Matrix4x4. Создаю матрицу Matrix4x4.Scale, делаю такую операцию rectMatrix.inverse.MultiplyPoint(mouse). И в итоге получаю вектор с NaN. Почему так? Должно же получатся такое mouse / scale.

seaman 08.01.2013 23:05

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

        public static Matrix4x4 SetPosition(this Matrix4x4 matrix, Vector3 position) {
                matrix.m03 = position.x;
                matrix.m13 = position.y;
                matrix.m23 = position.z;
                return matrix;
        }

Не уверен, что нельзя использовать ref в первом параметре, но ни одного такого примера не видел. Проверять некогда.
Код:

Texture2D hmap = (Texture2D)Resources.Load("Media\levelrts11")
Texture2D map = new Texture2D();
for (int z=0; z < grid; z++)
{
    for(int x=0; x < grid; x++)
    {
        Color c = hmap.GetPixel(x, z);
        map.SetPixel(x, z, Color.red);
    }
}


pax 09.01.2013 00:37

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

Сообщение от WISHMASTER35 (Сообщение 248709)
В смысле? Куда возвращать? После вызова метода матрица вообще не изменяется.

При использовании свойства ты берешь копию матрицы и передаешь ее в функцию, меняющую ее значения. Но обратно в это свойство ты ее не назначаешь. Матрица не класс, а ValueType - не ссылочный тип данных.

Т.е. в твоем случае надо
PHP код:

Handles.matrix Handles.matrix.SetPosition(new Vector3(1,2,3)); 

вместо ожидаемого неправильного
PHP код:

Handles.matrix.SetPosition(new Vector3(1,2,3)); 

В итоге возвращаемая матрица попадает в никуда

mauNgerS 09.01.2013 21:52

Ответ: Вопросы от новичка
 
seaman, приведённый тобой код не работает, но теперь понятно куда копать.

Можете помочь с этой функцией:

PHP код:

Scaner=CreatePivot()

Function 
GetHeight#(X#,Z#)
    
PositionEntity Scaner,X,50,Z
    RotateEntity Scaner
,90,0,0
    EntityPick Scaner
,100
    
Return PickedY()
End Function 


seaman 09.01.2013 22:19

Ответ: Вопросы от новичка
 
А это потому что я не понимаю, что делает Ваш код. Если в первом случае еще что-то можно попытаться догадаться, то тут совсем не понятно. Я Блиц не знаю. Посмотрел справочник - не смог понять что делает EntityPick - "Возвращает ближайшую сущность впереди указанной". Что значит "впереди"? По глобальной оси Z? Или ближе к камере? Похоже, что ближе к камере, т.к. в первом случае не имеет смысла узнавать ее координату Y - она будет та же, что у Вашего Сканера.
Лучше подождите, когда появятся спецы по Блицуи Юнити.

mauNgerS 09.01.2013 22:56

Ответ: Вопросы от новичка
 
Ок прошу прощения.

Первый код:
Имеется чёрно-белая картинка. Карта высот.
Я загружаю её в память. В цикле прохожусь по каждому пикселю и записываю значение цвета в массив. (красный, зеленый или синий - значения не имеет, какой-то один)

В дальнейшем я могу использовать этот массив для построения игрового уровня.

Второй код в целом позволяет узнать высоту любого участка игрового уровня. Это нужно для того, чтобы допустим посадить лес. Чтобы деревья не висели над землёй и не проваливались, а были на земле.

RegIon 09.01.2013 22:59

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

Сообщение от mauNgerS (Сообщение 248824)
seaman, приведённый тобой код не работает, но теперь понятно куда копать.

Можете помочь с этой функцией:

PHP код:

Scaner=CreatePivot()

Function 
GetHeight#(X#,Z#)
    
PositionEntity Scaner,X,50,Z
    RotateEntity Scaner
,90,0,0
    EntityPick Scaner
,100
    
Return PickedY()
End Function 


Гляди что есть: http://shgames.ru/
(спер из подписи PAXa)

mauNgerS 09.01.2013 23:12

Ответ: Вопросы от новичка
 
Blitz3D to Unity3D я смотрю в первую очередь.
Но на эти темы не нашёл там ответа


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

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