Play now

Показаны сообщения с ярлыком script. Показать все сообщения
Показаны сообщения с ярлыком script. Показать все сообщения

воскресенье, 21 июня 2015 г.

Unity optimisation tips


My previous article was in russian. So this I decided to write in English. 

Maybe you have heard or even already played Alco Invaders on PC. 

But we also make Alco Invaders for mobiles. We tested it on wide range of devices:

-Kindle Fire 1,
-HTC One,
-Nexus 4, 
-iPhone 4S, 
-iPad mini 2, 
- Galaxy Tab 4 
- and even tablet Windows 8.1.

So on all this devices we tried to achieve 50-60 fps performance. And we did it! And on almost all devices graphic level is the same as in PC. Except Kindle Fire - it doesn't support bloom :)





When we only started to work on game - performance was horrible. 15-20 fps on Android. But we decided make good picture in any way. 




In my previous article I have wrote about core elements of optimisation. And this about polishing optimisation. Secret tricks, which can save 20-30 % of performance.

1. Never use .transform in circles

It was a great surprise, when I discovered this thing. But in Unity .transform = .GetComponent<Transform>().

Example is Bullet script 
https://gist.github.com/Oxygamer/20100d06e11a8494042d

And getting component cost much in circles. In my tests it save almost 12 % of performance. So, make variable of type Transform and assign it in the Awake() function.


2. Vector3.Distance() is expensive enough.

The reason - is Mathf.Sqrt() inside this function.

So if you can - better use predefined table of distances or calculate it not in Update().
I used such trick in my Hexagon particle system. 

If you have some kind of grid - calculate distances between all elements and write it to simple array float[].

It saves ~ 10 % performance.




3. Almost all physical is expensive.

Maybe it's obvious, but you can forget about physics of explosion, or bullets. Check all them and try not use much physical objects in one time.



4. Use delayed trash cleaning.

For this purpose better use .SetActive(false), store object to some list, and Destroy() it in pause or end of level. It depends of your game type.

5. Shaders - use VertexLit if you can.

Maybe it's not huge difference between VertexLit and Diffuse, but Specular cost much. The reason is per pixel light rendering in Diffuse/Specular shaders and per vertex in VertexLit.




6. Use Dictionary<key,value> for prefab storage.

It's useful when you searching object with some name or type.  For example you can use List<> for Editor, and then put all this prefabs to Dictionary<> on game start.

As example - Object Storage script

https://gist.github.com/Oxygamer/c93d958ae138aef607b2

P.S

Hope this tricks and techniques will be useful for you ! If you have some questions - write it in comments. I will help with gladness :)

понедельник, 25 мая 2015 г.

Wave from dynamic mesh in Unity

Hello Unity devs :)

Today I want to talk about dynamic mesh generation and moving it. In other words we will create mesh wave like water wave.

Example of work you can see at this gif:


Quality of gif not so cool, but in Unity it rus very smooth )


To do this you need only one script.

All  work I have explained  in script comments

https://gist.github.com/Oxygamer/7cf831fcb54493fd64d4

To use it:

1.  Create empty GameObject and attach this script to it.
2.  Create Plane ( I use it because it have MeshCollider)
3.  Assign this plane to "MeshObject" in our empty object with MeshWave script.
4.  Run!

You can assign different materials to this wave. Mesh use material from our plane object.

MeshWave script has a lot of wave parameters:


When you play with values- you get very funny results )
Like this for example:

http://i.gyazo.com/033d74b14f8a391aca8b8e238c11c510.mp4


And I also put demo unity asset, which you can simply import :)


Get Asset

понедельник, 7 марта 2011 г.

Программирование на Unity. подключение Visual Studio


Привет всем.
Многие наверное видели возможности редактора Unity, но чтобы эта вся красота приводилась в движение нужно ее как-то запрограммировать.


По умолчанию написание кода происходит в самом редакторе. Для этого нужно просто открыть объект скрипта. Если он еще не создан то это можно сделать так:
Assets->Create->C Sharp Script.
Созданный скрипт на языке C# будет выглядеть как NewBehaviourScript.


 Если его перетянуть на любой другой объект в разделе Hierarchy, то он будет исполнятся по отношению к этому объекту,используя его функции и переменные.


При этом ,если скрипт не присоединить  ни к одному объекту, то он не будет исполнятся.
Будьте внимательны при переименовании классов! Имя класса должно обязательно совпадать с именем файла.


По умолчанию скрипт уже содержит пустые функции Update() и Start().
Update вызывается при отрисовке каждого кадра, поэтому если на разных компьютерах будет разный FPS, то обьекты могут двигатся тоже по разному.
Чтобы избежать этого  можно использовать фунцию FixedUpdate().
ее достаточно прописать как


 void FixedUpdate()
    {
    }
в файле скрипта.


Можно заметить что редактор кода по умолчанию не удобный, в нем нет всплывающих подсказок, и нельзя посмотреть какие переменные входят в объекты.
Решается все это очень просто. Вначале синхронизируем  проект с Visual Studio,нажимаем в любом месте вкладки Project правой кнопкой. И жмем "Sync Mono Develop Project" или "Sync Visual Studio Project".


Автоматически создастся solution (как в Vusual Studio  *.sln) в папке с проектом.


Если у вас еще не установлена Visual Studio. скачать ее можно с официального сайта майкрософт. Express версия бесплатная, и ее возможностей нам должно вполне хватить для написания скриптов.


http://www.microsoft.com/express/Downloads/


Его можно теперь открыть через Visual Studio и мы увидим файлы скриптов которые мы создали в разделе Assets.




Также у нас будет доступ к стандартным скриптам unity из папки Standart Assets.
Теперь мы можем удобно редактировать наш код.
Для примера можно прописать




void FixedUpdate()
    {
        transform.Translate(1, 0, 0);
    }
Это будет двигать наш объект по оси X на 1 м каждый вызов функции.


Чтобы проверить работу этого кода просто сохраним данный файл. например CTRL+S :)
Теперь если мы откроем окно реактора Unity то увидим что наш скрипт изменился.
Можно запускать проект(Ctrl+P). Если вы сделали все правильно, то объект к которому был прикреплен скрипт будет двигаться.


Для справки по функциям движка используйте официальный мануал:


http://docs.unity3d.ru/ScriptReference/






Удачи вам в новых начинаниях.


P.S Сам использую MonoDevelop больше полугода. Так как интеграция лучше работает. Вначале было неудобно, но привык ....
Тем,кто только начинает - стоит попробовать и Visual Studio, и MonoDevelop.  Что будет удобней, то и юзайте :)