forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Unity (http://forum.boolean.name/forumdisplay.php?f=144)
-   -   Фак по Юнити. (http://forum.boolean.name/showthread.php?t=12966)

Sef 30.12.2010 12:14

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Kiroff (Сообщение 173649)
Я недавно начал изучать unity, поэтому накопилось много вопросов. В общем, у меня такое дело:

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

Видео урок на русском:
http://www.4shared.com/dir/Vyojz94v/..._lesson01.html

Evgen 21.01.2011 01:23

Ответ: Фак по Юнити.
 
Пробовал этот скрипт в деле:
http://www.unifycommunity.com/wiki/i...ramesPerSecond

В статистике 200 FPS, а скрипт показывает 70. В чем подвох?

pax 21.01.2011 01:30

Ответ: Фак по Юнити.
 
А вертикальная синхронизация отключена?
Вообще плеер может не полностью ресурсы компьютера использовать... Попробуй брать мгновенный fps и вычисляй среднее как вариант (fps = 1f/(Time.deltaTime/Time.timeScale)), выводи раз в секунду например. Сорри первая формула была неудачной )

Evgen 21.01.2011 01:56

Ответ: Фак по Юнити.
 
Формула то рабочая я тоже так по началу считал.
Это похоже глюк или неправильные настройки в среде разработки. Когда запускаешь в среде этот код, больше 60 он не показывает при этом в статистике 200 FPS. Стоит скомпилировать exe и запустить, этот код уже будет показывать 200 FPS как и в статистике.

Код:

float fps,accum,fr;

Update(){
                fr++;
                accum+=1.0f/(Time.deltaTime/Time.timeScale);
                if(fr>50){
                        fps=accum/50f;
                        fr=0;
                        accum=0;
                }       
                    print("fps "+fps);
}

Не знаю с чем это связанно.

pax 21.01.2011 01:58

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Evgen (Сообщение 176376)
Не знаю с чем это связанно.

Зачем отбирать у редактора все ресурсы во время дебага? Считает он по времени обработки кадра, а не по количеству кадров.

Evgen 21.01.2011 02:11

Ответ: Фак по Юнити.
 
Можно например так:
Код:

if(Time.frameCount%50==0)fps=(int)(1.0f/(Time.deltaTime/Time.timeScale));
Все равно на точность (при запуске в среде) не повлияло.
П.С. однако этот метод гораздо компактнее. чем http://www.unifycommunity.com/wiki/i...ramesPerSecond

Evgen 21.01.2011 19:43

Ответ: Фак по Юнити.
 
А как в unity делаются биллбоарды (спрайты повернутые всегда лицом к камере)? какие классы и методы для этого используются?

pax 21.01.2011 19:55

Ответ: Фак по Юнити.
 
Частицами можно сделать, можно самому считать. Например взять план и повесить скрипт, поворачивающий каждый кадр модель на камеру. Самый нормальный способ - частицами. У них есть специальный режим рендеринга для этого.

Nuprahtor 21.01.2011 19:58

Ответ: Фак по Юнити.
 
http://www.unifycommunity.com/wiki/i...acingBillboard

Evgen 21.01.2011 20:12

Ответ: Фак по Юнити.
 
А что быстрее? Класс particle emitter вроде бы слишком перегружен, там и ускорения и отклонения и чего только нету. Может плэйн быстрее как думаете?

pax 21.01.2011 20:39

Ответ: Фак по Юнити.
 
Частицы быстрее, если тебе надо сотню и больше билбоардов. Управляй созданием частиц в ручную в эмиттере, и сможешь отрисовать все частицы за один draw call.

Evgen 21.01.2011 21:30

Ответ: Фак по Юнити.
 
Использую particle emitter, со скоростью все Ок! 16000 партиклов 150FPS. :)

А как через код установить текстуру particleEmitter?
И почему я создаю желтый партикл Color.yellow, а на экране отображается розовый?

П.С. Если кому интересно небольшой рабочий тест.
дополнительно к объекту нужно прикрутить Particle Renderer и Elipsoid Particle Emitter

Код:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

        // Use this for initialization
        void Start () {
                particleEmitter.useWorldSpace = true;
        }
       
        // Update is called once per frame
        void Update () {
                float x,y,z;
                for(int i=0; i<50; i++){       
                        x=Random.Range(50, 1024-50);
                        y=Random.Range(-10, 50);
                        z=Random.Range(50, 1024-50);
                        particleEmitter.Emit(new Vector3(x,y,z), Vector3.up, 3.0f, 2f, Color.yellow);
                }       
                print(particleEmitter.particleCount);
        }
       
}


pax 21.01.2011 21:35

Ответ: Фак по Юнити.
 
Используй явное создание частиц
http://unity3d.com/support/documenta...particles.html
а материал определяет ParticleRenderer

Evgen 21.01.2011 21:53

Ответ: Фак по Юнити.
 
Забыл что к камере прикрутил, Particle Renderer и Elipsoid Particle Emitter. в свойствах Render можно поставить материал.

Теперь все работает.

Nuprahtor 25.01.2011 20:03

Ответ: Фак по Юнити.
 
Возникла нехорошая проблема.
Персонаж игрока условно - куб с Box Collider`ом. Враги тоже.
Их я двигаю transform.Translate`ом и они не реагируют на столкновения вообще никак.
У меня возникло подозрение, что transform.Translate не учитывает физику, и мне стало от этого грустно.
Какой командой стоит передвигать персонажей, или какие компоненты стоит добавить (пробовал Rigidbody, однако безрезультатно)

pax 25.01.2011 21:12

Ответ: Фак по Юнити.
 
Если все объекты с коллайдерами и двигаются, то им необходимо добавить RigidBody и его переключить в режим IsKinematic и передвигать их надо в FixedUpdate.

Nuprahtor 25.01.2011 21:27

Ответ: Фак по Юнити.
 
Хм, не помогло, ригидбади установлены, пробовал со всеми комбинациями галочек...

pax 25.01.2011 21:35

Ответ: Фак по Юнити.
 
Коллайдеры случаем не в режиме IsTrigger? В каком слое коллайдеры находятся? В настройках физики - эти слои между собой могут сталкиваться?

Nuprahtor 25.01.2011 21:37

Ответ: Фак по Юнити.
 
Могут сталкиваться, коллайдеры не триггеры

pax 25.01.2011 21:38

Ответ: Фак по Юнити.
 
Тогда не могу предполагаать... если только transform который двигает объект не на том же объекте что и коллайдер...

Nuprahtor 25.01.2011 21:45

Ответ: Фак по Юнити.
 
Вложений: 1
Нет, трансформ там же находится
Вот сцена, если есть возможность посмотреть

pax 25.01.2011 21:58

Ответ: Фак по Юнити.
 
Посмотрел, похоже чтобы сталкивались наверное надо двигать объекты физикой. Либо использовать вместо BoxCollider - CharacterController. Либо вручную обрабатывать события он CollisionEnter.

Taugeshtu 17.02.2011 15:29

Ответ: Фак по Юнити.
 
Цитата:

Возникла нехорошая проблема.
Персонаж игрока условно - куб с Box Collider`ом. Враги тоже.
Их я двигаю transform.Translate`ом и они не реагируют на столкновения вообще никак.
У меня возникло подозрение, что transform.Translate не учитывает физику, и мне стало от этого грустно.
Какой командой стоит передвигать персонажей, или какие компоненты стоит добавить (пробовал Rigidbody, однако безрезультатно)
боролся кстати с этим недавно... решение получилось костыльным)
Rigidbody, в Update() включать IsKinematic, двигать transform.position как хочется, выключать IsKinematic, обнулять rigidbody.velocity и angularVelocity.

Andvrok 01.03.2011 22:08

Ответ: Фак по Юнити.
 
Код:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    public GameObject respawnPrefab;
    public GameObject[] respawns = GameObject.FindGameObjectsWithTag("Respawn");
    void Awake() {
        foreach (GameObject respawn in respawns) {
            Instantiate(respawnPrefab, respawn.transform.position, respawn.transform.rotation);
        }
    }
}

Запускаю, но в массиве пусто :(
Префаб назначен, скрипт в сцене размещен, точки респавна присутствуют, все теги выставлены.

И второй вопрос: как сделать триггер на партиклы? Например, стоишь в огне и у тебя здоровье отнимается.

pax 02.03.2011 01:48

Ответ: Фак по Юнити.
 
делай так
Код:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    public GameObject respawnPrefab;
    public GameObject[] respawns;
    void Awake() {
        respawns = GameObject.FindGameObjectsWithTag("Respawn");
        foreach (GameObject respawn in respawns) {
            Instantiate(respawnPrefab, respawn.transform.position, respawn.transform.rotation);
        }
    }
}

по второму вопросу - используй MonoBehaviour.OnTriggerStay

Andvrok 02.03.2011 08:58

Ответ: Фак по Юнити.
 
По первому вопросу разобрался, спасибо.

По второму:
Код:

using UnityEngine;
using System.Collections;

public class example : MonoBehaviour {
    void OnTriggerStay(Collider other) {
        if (other.attachedRigidbody)
            other.attachedRigidbody.AddForce(Vector3.up * 10);
       
    }
}

А если у меня коллайдер не ригидбоди?

pax 02.03.2011 10:19

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Andvrok (Сообщение 181117)
А если у меня коллайдер не ригидбоди?

В функцию передается коллайдер, находящийся в триггере, по нему можно получить GameObject или другой компонент этого объекта. Вот с ними и выполняйте операцию снижения здоровья.

Справка для примера, в ней что-то типа эффекта воздушной подушки или вентилятора вверх описано. Это не значит, что надо делать все как в примере.

Andvrok 02.03.2011 15:19

Ответ: Фак по Юнити.
 
Опробовал способ с OnTriggerStay - ничего не получилось. Для проверки кода создал сферу-триггер, прицепил ей тот же скрипт - все работает как надо. Видимо для партиклов нужен особый подход..

pax 02.03.2011 15:36

Ответ: Фак по Юнити.
 
Ну все правильно, ставь объект пустышку со сферическим коллайдером в место костра и все. Это истинный путь джедая )

Andvrok 02.03.2011 15:39

Ответ: Фак по Юнити.
 
Повесил на партиклы скрипт
Код:

public GameObject go;

        void Start () {
                Instantiate(go,transform.position,transform.rotation);
        }

Вроде работает :)

Новый вопрос теперь: как перемещать партиклы?

pax 02.03.2011 18:05

Ответ: Фак по Юнити.
 
Ну у каждого GO есть трансформ, если менять его позицию (transform.position) то объект будет перемещаться в пространстве...

Andvrok 02.03.2011 22:14

Ответ: Фак по Юнити.
 
Если бы все было так просто, я бы не спршивал :( Пытаюсь перемещать с помощью transform.Translate - результат нулевой.

pax 02.03.2011 22:16

Ответ: Фак по Юнити.
 
Все достаточно просто. Скрипт перемещения висит на объекте с частицами?

Andvrok 02.03.2011 22:21

Ответ: Фак по Юнити.
 
Не совсем. Частицы создаются инстантиатом со скрипта на игроке, следовательно перемещение тоже там.

Если быть точнее - нужно реализовать 'фаерболл', создающийся инстантиатом в префабе игроке и летящий по форварду, правда как реализовать в таком случае обработку коллизии фаерболла со стеной я в непонятках :(

Пробовал разобрать на примере РПГ с некоторого примера, но там создается ригидбоди, а партиклы создаются уже при столкновении, но не делать же фаерболл ригидбодом?

Ригидбоди то можно толкнуть силой :(

pax 02.03.2011 22:27

Ответ: Фак по Юнити.
 
Столкновения можно посчитать кастом. Все еще не вижу проблем. Вешайте скрипт перемещения на партиклы, туда же скрипт проверки столкновений. Лучше это в один скрипт объединить.

Andvrok 02.03.2011 22:35

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от pax (Сообщение 181200)
Столкновения можно посчитать кастом.

Ссылочку на референс, пожалуйста, что за касты такие.

pax 02.03.2011 22:38

Ответ: Фак по Юнити.
 
Пожалуйста, но можно и поучиться пользоваться справкой и поиском в ней ;)
http://unity3d.com/support/documenta...e/Physics.html
http://unity3d.com/support/documenta...s.Raycast.html
и другие касты, выбирай, которые лучше подойдут.

Evgen 12.03.2011 14:46

Ответ: Фак по Юнити.
 
Вложений: 1
Возможно ли сделать такой шейдер который заменял бы в текстуре все пикселы определенного цвета (например белого r=255 g=255 b=255) на тот который указан в anyobject.renderer.material.color.

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

pax 12.03.2011 14:52

Ответ: Фак по Юнити.
 
самый простой способ - сделать у текстуры альфаканал (если конечно он не используется) и значение альфы использовать для интерполирования цвета от цвета текстуры до указанного цвета. Если альфаканал используется, то можно взять еще одну текстуру, и использовать какой-то ее канал для данной задачи. Писал как-то похожий шейдер:
PHP код:

Shader "Masked/Diffuse" {
    
Properties {
        
_Color ("Color"Color) = (1,1,1,1
        
_MainTex ("Base (RGB)"2D) = "white" {}
        
_Mask ("Mask (Grayscale)"2D) = "black" {}
    }
    
SubShader {
        
Tags "RenderType"="Opaque" }
        
LOD 200
        
        CGPROGRAM
        
#pragma surface surf Lambert

        
sampler2D _MainTex;
        
sampler2D _Mask;
        
float4 _Color;

        
struct Input {
            
float2 uv_MainTex;
            
float2 uv_Mask;
        };

        
void surf (Input INinout SurfaceOutput o) {
            
half4 c tex2D (_MainTexIN.uv_MainTex);
            
float m tex2D (_MaskIN.uv_Mask).r;
            
o.Albedo =  (1-m)*c.rgb m*_Color.rgb;
            
o.Alpha c.a;
        }
        
ENDCG
    

    
FallBack "Diffuse"



Evgen 12.03.2011 15:08

Ответ: Фак по Юнити.
 
Спасибо Pax. Я в шейдерах ничего не смыслю.
А можно что то типа:
if(color=(255,255,255)color=materal.color;
чтобы обойтись без текстуры маски.

pax 12.03.2011 15:12

Ответ: Фак по Юнити.
 
Можно, но эффект будет не таким хорошим. Попробуй написать сам ;) а с одной текстурой можно использовать альфаканал.
PHP код:

Shader "Diffuse - Alpha Mask" {
    
Properties {
        
_Color ("Color"Color) = (1,1,1,1
        
_MainTex ("Base (RGB)"2D) = "black" {}
     }
    
SubShader {
        
Tags "RenderType"="Opaque" }
        
LOD 200
        
        CGPROGRAM
        
#pragma surface surf Lambert

        
sampler2D _MainTex;
         
float4 _Color;

        
struct Input {
            
float2 uv_MainTex;
        };

        
void surf (Input INinout SurfaceOutput o) {
            
half4 c tex2D (_MainTexIN.uv_MainTex);
            
float m c.a;
            
o.Albedo =  (1-m)*c.rgb m*_Color.rgb;
        }
        
ENDCG
    

    
FallBack "Diffuse"


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

Evgen 12.03.2011 15:53

Ответ: Фак по Юнити.
 
Вложений: 1
Еще раз спасибо.

Цитата:

Сообщение от pax (Сообщение 182465)
Попробуй написать сам ;) а с одной текстурой можно использовать альфаканал.

Да уже и так все хорошо работает ;)

И тот и другой метод работает. Но вы правы, с маской пожалуй все-таки лучше.

Собственно результат:

Andvrok 13.03.2011 13:12

Ответ: Фак по Юнити.
 
Как привязать префабу дочерний префаб, как сделано, например, в FirstPersonController?

Reks888 13.03.2011 13:19

Ответ: Фак по Юнити.
 
Перетащить мышкой один на другой?

pax 13.03.2011 13:19

Ответ: Фак по Юнити.
 
FirstPersonController - это один префаб

Nuprahtor 13.03.2011 13:19

Ответ: Фак по Юнити.
 
Дочерний префаб? Как это? Имеется ввиду иерархия объектов (один префаб состоит из множества объетов)?

pax 13.03.2011 13:20

Ответ: Фак по Юнити.
 
как мы одновременно ))

Andvrok 13.03.2011 13:25

Ответ: Фак по Юнити.
 
Похоже, мы друг друга не поняли)
Вот префаб FirstPersonController состоит одновременно из самого себя, компонента Graphics и камеры Main Camera, но если попробовать добавить камеру любому другому префабу, то спрашивается, заменить ли один префаб на другой(

Nuprahtor 13.03.2011 13:27

Ответ: Фак по Юнити.
 
Если камеру добавлять в списке префабов, а не в инспекторе, все будет ОК ;)

Andvrok 13.03.2011 13:30

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от Nuprahtor (Сообщение 182625)
Если камеру добавлять в списке префабов, а не в инспекторе, все будет ОК ;)

Эм, а это как?

Nuprahtor 13.03.2011 13:38

Ответ: Фак по Юнити.
 
Перепутал окно иерархии с инспектором
В общем, создаешь два объекта - obj1 и obj2. В окне Hierarchy перетягиваешь obj1 на obj2, получится структура.
В окне Project жмешь правой кнопкой - Create Prefab. Перетягиваешь иерархию объектов obj1-obj2 на префаб, теперь созданный префаб является этой иерархией
В Project указав префаб, ты можешь добавлять к нему компоненты, и эти компоненты добавятся ко всем объектам в Hirerarchy.
Это базовые основы работы с префабами

Andvrok 13.03.2011 13:45

Ответ: Фак по Юнити.
 
И как я не додумался до такого элементарного :(
А я как дурак тягал с иерархии понесколько объектов на префаб и огорчался, что "кубик то серый", про структуру вообще из головы вылетело:(

Evgen 18.03.2011 21:22

Ответ: Фак по Юнити.
 
To PAX не подкините пример как сделать так, чтобы на террайне оставались следы от гуссениц.

asdon 18.03.2011 23:44

Ответ: Фак по Юнити.
 
Как сделать, чтобы шарик катался на стрелочках?

Evgen 19.03.2011 00:27

Ответ: Фак по Юнити.
 
Пардон, уже что-то нашел, наверное этого хватит:
http://www.decane.net/external/gener...munity_1.1.zip

Что-то вроде этого:
PHP код:

using UnityEngine;
using System.Collections;

public class 
Tracks MonoBehaviour {
    
    public 
Mesh mesh;
    public 
int maxtracks=500;
    public 
Vector3[] newVertices;
    public 
Vector2[] newUV;
    public 
int[] newTriangles;
    
    
void Start() {
        
newVertices=new Vector3[maxtracks*4];
        
newUV=new Vector2[maxtracks*4];
        
newTriangles=new int[maxtracks*2*3];
        for(
int i=0;i<maxtracks*4;i+=4){
            
float x=Random.Range(30,60);
            
float y=Random.Range(30,60);
            
newVertices[i]=new Vector3(x,8,y);
            
newVertices[i+1]=new Vector3(x+1,8,y);
            
newVertices[i+2]=new Vector3(x,8,y+1);
            
newVertices[i+3]=new Vector3(x+1,8,y+1);
        }    
        for(
int i=0;i<maxtracks*4;i+=4){
            
newUV[i]=new Vector2(0,0);
            
newUV[i+1]=new Vector2(1,0);
            
newUV[i+2]=new Vector2(0,1);
            
newUV[i+3]=new Vector2(1,1);
        }    
        for(
int i=0;i<maxtracks;i++){
            
newTriangles[i*6]=i*4;
            
newTriangles[i*6+1]=i*4+2;
            
newTriangles[i*6+2]=i*4+1;
            
newTriangles[i*6+3]=i*4+3;
            
newTriangles[i*6+4]=i*4+1;
            
newTriangles[i*6+5]=i*4+2;            
        }    
        
mesh = new Mesh();
        
GetComponent<MeshFilter>().mesh mesh;
        
mesh.Clear();
        
mesh.vertices newVertices;
        
mesh.uv newUV;
        
mesh.triangles newTriangles;
    }
    
    
void Update() {

    }    



pax 19.03.2011 12:03

Ответ: Фак по Юнити.
 
Цитата:

Сообщение от asdon (Сообщение 183238)
Как сделать, чтобы шарик катался на стрелочках?

Скачать примеры игр с Asset Store от студии M2H.

~Test~ 19.03.2011 21:53

Ответ: Фак по Юнити.
 
Подскажите, в assets имеется модель, я ее подгружаю программно при помощи
GameObject instance = (GameObject)Instantiate(Resources.Load("model")); ну т.е. создаются клоны этого объекта; так вот как прицеплять скрипты к этому клону-объекту (программно) ? или же как-то можно прицепить к модели скрипты (но она не на сцене находится а просто в папке валяется). Спасибо

Nuprahtor 19.03.2011 21:57

Ответ: Фак по Юнити.
 
Что мешает пользоваться готовым префабом со скриптом?

pax 19.03.2011 22:08

Ответ: Фак по Юнити.
 
GameObject.AddComponent()
либо кидай компоненты прямо на префаб или на модель.

~Test~ 25.03.2011 06:53

Ответ: Фак по Юнити.
 
Необходимо реализовать следующее:
имеется GUILayout.Button - прицеплено определенное действие просто по клику на кнопку, а еще надо осуществить возможность перетаскивания с кнопки (т.е. на кнопку навели->нажали->удерживаем и тащим (не кнопку а просто удержанной кнопкой курсор ведем в сторону) ) - проблема именно с определение вот этого состояния, когда на кнопку нажали и держат - подскажите пжлста как реализовать такое. Спасибо.

pax 25.03.2011 10:23

Ответ: Фак по Юнити.
 
Мне кажется можно это сделать обрабатывая события GUI:

1. Определить над какой кнопкой находится мышка.
2. Обработать Event.type (EventType.MouseDown - начало перетаскивания, EventType.MouseUp - конец перетаскивания, EventType.MouseDrag - само перетаскивание).

Можно поступить по другому:

1. Определить над какой кнопкой находится мышка.
2. Сохранить информацию об этом.
3. Перетаскивание организовать в Update с помощью Input.

pax 26.03.2011 22:12

Ответ: Фак по Юнити.
 
Два сообщения перемеcтил сюда: http://forum.boolean.name/showthread.php?t=14476

Evgen 27.03.2011 16:22

Ответ: Фак по Юнити.
 
Я так понял после создания террайна его heightmap изменять уже нельзя.
http://unity3d.com/support/documenta...tmapWidth.html

Тогда, как програмнно создать terrain определенного размера чтобы heightmap был 512х512 например.

pax 27.03.2011 16:41

Ответ: Фак по Юнити.
 
т.е. как нельзя?

http://forum.boolean.name/showthread.php?t=14451


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

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