Пссс, если вы хотите веб, почему не взяли нормальный хтмл5 движок?
Не на столько сильно я хочу веб. Посмотрю будет ли развиваться WebGL в Unity. Буду тестить от версии к верии. Если не будет развиваться и если Web Player выпилят из всех браузеров, то я просто буду собирать на что собирается без особых проблем.
Он медленнее запускается. А в сентябре на Chrome не будет запускаться. Мне этот браузер больше нравится. Для моих простых игр пока хватит WebGL Preview. Может к тому времени, как я буду сильнее и выйдет полноценный WebGL, без Preview.
Мне один из разработчиков ответил здесь, что это исправят в 5.2 и можно попробовать Application.ExternalCall("window.focus();");
Цитата
I can't test it because I don't have a VK account, but, probably this is a known issue, where the WebGL content will not focus the iframe when clicked on it correctly. This will be fixed in an upcoming release (I believe 5.2), but it is also possible to work around it by calling: Application.ExternalCall("window.focus();"); to force the iframe to be focused.
Добавлено (26 августа 2015, 15:55) --------------------------------------------- Попробовал я добавить команду: Application.ExternalCall("window.focus();");
Клавиши не заработати. Вывод: буду использовать WebPlayer пока не выйдет 5.2.
Добавлено (26 августа 2015, 19:53) ---------------------------------------------
ЦитатаVinchensoo ()
Да веб-плеер пока еще вполне норм.
Пусть в Хром не работает, зато в FireFox и Opera - нормально.
Я сравнил по Марио. В плеере работает без задержек, а WebGL неприятно лагает.
Добавлено (27 августа 2015, 14:09) --------------------------------------------- Ответили, что вместо ExternalCall нужно использовать ExternalEval, но у меня приложение падает с ошибкой:
Цитата
"An error occured running the Unity content on this page. See your browser's JavaScript console for more info. The error was:Uncaught SyntaxError: Unexpected token )"
Но ведь в документации написано, что for Web Player only. Значет для WeGL не годится.
Я собрал WebGL с опцией "Fastest (very slow builds)" и собрал в WebPlayer. Посмотрите какая разница (это прямые ссылки, не VK):
Может быть, действительно, баг. Я заметил, работает через раз. Если во время запуска кликать и нажимать W, то частенько начинает работать.
Добавлено (25 августа 2015, 14:37) --------------------------------------------- Я решил проблему. Просто во время загрузки приложения нужно кликать мышкой по сцене и нажимать W, тогда 100% начинает обрабатывтаь клавиши. Нужно только придумать, где руководство пользователя написать. Может исправят баг.
Сообщение отредактировал 8Observer8 - Вторник, 25 Августа 2015, 14:39
using UnityEngine; using System.Collections; using System.Collections.Generic; using System.Linq;
public class Snake : MonoBehaviour { // Tail Prefab public GameObject tailPrefab;
// Speed public float speed = 0.01f;
// Drow in next movement? private bool ate = false;
// Current Movement Direction private Vector2 dir = Vector2.right;
// Keep track of tail private List<Transform> tail = new List<Transform>();
// Use this for initialization void Start () { // Move snake every 300ms InvokeRepeating("Move", speed, speed); }
// Update is called once per frame void Update () { var h = Input.GetAxisRaw("Horizontal"); var v = Input.GetAxisRaw("Vertical");
if (v > 0) { dir = Vector2.up; } else if (v < 0) { dir = Vector2.down; }
if (h < 0) { dir = Vector2.left; } else if (h > 0) { dir = Vector2.right; } }
void Move() { // Save current position (gap will be here) Vector2 v = transform.position;
// Move head into new direction (now there is a gap) transform.Translate(dir);
// Ate? Then insert track into gap if (ate) { // Set track into grap var track = Instantiate(tailPrefab, v, Quaternion.identity) as GameObject;
// Keep track into tail list tail.Insert(0, track.transform);
// Reset flag ate = false; } else if (tail.Count > 0) // Do we have a tail? { // Move last tail element to where the head was tail.Last().position = v;
// Add to front of list tail.Insert(0, tail.Last());
// Remove from the back tail.RemoveAt(tail.Count - 1); } }
void OnTriggerEnter2D(Collider2D coll) { // Food? if (coll.name.StartsWith("FoodPrefab")) { // Get longer in next Move coll ate = true;
// Remove the food Destroy(coll.gameObject); } else // Collided with Tail or Border { // ToDo show lose scene Debug.Log("You lost."); } } }
SpawnFood.cs
Код
using UnityEngine; using System.Collections;
public class SpawnFood : MonoBehaviour { // Food Prefab public GameObject foodPrefab;
// Borders public Transform borderTop; public Transform borderBottom; public Transform borderLeft; public Transform borderRight;
// Use this for initialization void Start() { // Spawn food every 4 second, starting in 3 InvokeRepeating("Spawn", 3, 4); }
// Spawn a food void Spawn() { // x position between Left & Right border int x = (int)Random.Range(borderLeft.position.x, borderRight.position.x);
// y position between Bottom & Top border int y = (int)Random.Range(borderBottom.position.y, borderTop.position.y);
// Instantiate the food at (x, y) Instantiate(foodPrefab, new Vector2(x, y), Quaternion.identity); } }
На ассет стор есть отличный "Standard Assets" там есть пример 2д платформера
Скрипт я оттуда и взял. Называется CameraFollow.
Цитатаbasist ()
Это что-то в скриптах перемудрил.
Я посмотрю внимательнее.
Я написал скрипт на Python для GIMP:
add-pixels-to-tiles.py
Код
#!/usr/bin/env python # -*- coding: utf-8 -*-
# add-pixels-to-tiles v1.0: Python-fu plugin for GIMP 2.8 # Copyright Ivan Enzhaev (8Observer8) [http://ivan.enzhaev.name], 2015 # Licence GPL-2 # Installation: put the file into /GIMP 2/lib/gimp/2.0/plug-ins
from gimpfu import * import os
def python_fu_add_pixels_to_tiles(tile_size = 16): # Get image image = gimp.image_list()[0] # Get drawable drawable = pdb.gimp_image_get_active_drawable(image) # Get width and height width = pdb.gimp_image_width(image) height = pdb.gimp_image_height(image)
# Right x = 17 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x+1,y,x+2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 17 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Top x = 2 y = 2 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y-1,x,y-2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 2 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
# Left x = 2 y = 2 spacing = 5 y_counter = 0
while y < height: while x < width: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x-1,y,x-2,y] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) x = x + spacing + tile_size x = 2 if y_counter < tile_size: y = y + 1 else: y = y + spacing y_counter = 0
# Down x = 2 y = 17 spacing = 5 x_counter = 0
while x < width: while y < height: # Get color color = pdb.gimp_color_picker(image, drawable, x, y, FALSE, FALSE, 0) # Set end point ctrlPoints = [x,y+1,x,y+2] if color.a == 1: # Set color pdb.gimp_context_set_foreground(color) # Draw points pdb.gimp_pencil(drawable, 4, ctrlPoints) y = y + spacing + tile_size y = 17 if x_counter < tile_size: x = x + 1 else: x = x + spacing x_counter = 0
register( "python_fu_add_pixels_to_tiles", "Add a few pixels to tiles", "Add a few pixels to tiles", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "Ivan Enzhaev (nickname: 8Observer8; email: 8observer8@gmail.com)", "8/18/2015", "AddPxToTiles", "*", [ (PF_INT, "tile_size", "Tile Size", 16) ], [], python_fu_add_pixels_to_tiles, menu="<Image>/Filters/Map", )
main()
который вот это изображение:
преобразует в это:
Скрипт работает 8 минут 25 секунд. Попробую сначала переписать его для Photoshop на JavaScript. Если будет так же долго, то буду писать плагин для Unity. Если и это не поможет, то буду делать алгоритм оптимальнее.
Добавлено (19 августа 2015, 19:25) --------------------------------------------- Я решил пока не терять время с плагинами. Работает, пусть и медленно. Но мне же один раз нужно обработать TileSet.
По поводу Occlusion Culling. Здесь я узнал, что объекты должны скрываться даже на Scene. Для построения сетки нужно чтобы все объекты были на сцене.
Я создал пустой объект CreateWorld_1_1. Повесил на него скрипт с тем же именем, в котором в Start'е создавал уровень. Но теперь я Start переименовал в CreateWorld. Создал скрипт World_1_1_Inspector, который унаследовал от Editor. Теперь я могу построить уровень до запуска игры:
Код
using UnityEngine; using System.Collections; using UnityEditor;
[CustomEditor(typeof(CreateWorld_1_1))] public class World_1_1_Inspector : Editor { private CreateWorld_1_1 world;
void OnEnable() { world = (CreateWorld_1_1)target; world.CreateWorld(); }
public override void OnInspectorGUI() { if (GUILayout.Button("Hello")) {
} } }
Попробую теперь реализовать Occlusion Culling.
Добавлено (19 августа 2015, 20:14) --------------------------------------------- Оказывается, для работы Occlusion Culling нужен "Mesh Renderer", а не "Sprite Renderer".
Добавлено (19 августа 2015, 20:53) --------------------------------------------- У меня вот здесь ошибка:
Код
void OnEnable() { world = (CreateWorld_1_1)target; world.CreateWorld(); }
Нужно по кнопке мир создавать. А то в OnEnable у меня столько копий насоздавалось.
Опция Occlusion Culling работает только для 3D. Есть выход - использовать этот самодельный, который предложил basist.
Сообщение отредактировал 8Observer8 - Среда, 19 Августа 2015, 20:55
тогда лучше - второй вариант организации взаимодействий - убрать всю физику!
Тут тоже есть проблемы в поиске простого решения. Позже, как руки дойдут, подробнее опишу проблему или покажу простой пример. В кратце, использую OnTriggerStay2D, но при упорстве можно проехать поверх танка врага.
Сообщение отредактировал 8Observer8 - Среда, 19 Августа 2015, 09:02
За пример большое спасибо, но он не решает проблемы. Мне нужна физика (точнее её отсутствие), как в оригинальном Battle City, где нельзя двигать танки.
Большое спасибо, что напомнил о Ocllusion Culling. Обрати внимание, что на видео, хотя и дата 2015 года, но используется старый подход, когда эта опция входила в Pro версию. Я прочитал в документации, что для включения опции нужно поставить для объектов "Occludee Static", потому что у меня объекты не перекрывают другие. Всё равно так же подтормаживает перемещение камеры, но что интересно FPS не просидает ниже 70. А ещё я попробовал убрать галочки "Occludee Static" и FPS остался на том же уровне.
Сообщение отредактировал 8Observer8 - Вторник, 18 Августа 2015, 18:19
А я смогу потом нарезать полученную текстуру с помощью "Sprite Editor"? Будет ли это сложнее, чем написать плагин для GIMP?
Пока что я понял, как работать с GIMP'ом через Python. Это довольно просто. Есть консоль, которую можно отрыть так: в меню выбрать "Filters" -> "Python-Fu" -> "Console"
В консоле есть кнопка "Browse...". При нажатии отрывается справка, где можно искать API функции, читать описания. Например, можно навести на кнопку с пипеткой и увидеть её название: "Color Picker". Ввести это название в поиске окна "Browse...". Найдётся функция: gimp-color-picker. Можно прочитать её описание и какие аргументы она принимает. Если выделить функцию и нажать кнопку "Apply", но в консоль скопируется следующее:
Цитата
color = pdb.gimp_color_picker(image, drawable, x, y, sample_merged, sample_average, average_radius)
У меня такая идея. Сначала применить этот скрипт, чтобы сделать расстояние между тайлами в 5 пикселей. А потом в своём скрипте брать пипеткой цвет на краю тайла и рисовать с помощью функции gimp.pencil рядом ещё два таких пиксела. И так для каждого крайнего пиксела.
Сообщение отредактировал 8Observer8 - Вторник, 18 Августа 2015, 13:39
Делать в захлёст! А это идея! Посмотрю по ранее озвученным инструментам, так как это дело нужно максимально автоматизировать.
Добавлено (14 августа 2015, 18:04) --------------------------------------------- Мне одному кажется, что игра немного подтормаживает или нормально? SuperMario_1.3.0 (win).7z
Добавлено (17 августа 2015, 15:49) --------------------------------------------- Я проверил притормаживает ли Марио на более мощной машине. Оказывается, нет. Это всё из-за того, что я генерирую все префабы с тайлами сразу. Я вижу один простой выход. Раз уровень хранится в двумерном массиве, то я могу разбить его на минимальные куски. Подгружать постепенно новые куски карты и уничтожать те, что пройдены.
По поводу решения с просветом между тайлами, которое предложил seaman выше. Я не нашёл готовых программ, которые бы преобразовывали тайлсеты так, чтобы тайл увеличивался на два пикселя в каждую из 4-х сторон. Возможно у меня получится написать плагин для GIMP. Сначала рассматривал вариант на скриптах C# с помощью GIMP#, но проект с 2012 года не развивается и работает только с GIMP 2.4. Остаётся вариант Python-Fu. У меня есть небольшой опыт скриптинга на Python BGE. Тем более опыт написания плагинов для GIMP может пригодится.
Сообщение отредактировал 8Observer8 - Понедельник, 17 Августа 2015, 16:06
ты не прав, если у танка масса больше то он вполне может столкнуть другой танк, да и на скоросте 50+ кмч хоть не много да сдвинешь танк, если масса танка в который врезаешься не на 5+ тонн больше... в общем возьми в wot поиграй и посмотри как ведут сеья танки
Не может столкнуть, так как речь идёт об игре Battle City.
Сообщение отредактировал 8Observer8 - Воскресенье, 16 Августа 2015, 21:22
У меня такой же вопрос. Я делаю клон Марио. Там каждый кирпичный блок должен быть отдельным спрайтом, чтобы его можно было разбить или толкнуть. Первый уровень я генерирую сразу весь. А во втором очень много кирпичных блоков. Я думаю, будет тормозить. Сильно ли коллайдеры влияют на производительность? Так получилось, что у меня на каждом блоке их по четыре. В общем, посоветуйте как быть.
Ещё такой момент. Я срисовываю карту в Tile Map Editor, но экспортирую не картой, а в текстовый файл.
У меня проблемы нет. Как я ее решил - я сказал в видео. Сделал зазор 1 пиксель.
Я показал за сполером выше. Там проблема не в один пиксел, гораздо меньше. Щель между тайлами. Я заметил, что в вашем клоне танчиков, проблему не видно на разрешении 800x600, а на 1024x728 её видно.
Добавлено (13 августа 2015, 13:00) ---------------------------------------------
Цитатаseaman ()
Сделал зазор 1 пиксель.
Эту проблему "с засвечиванием соседнего тайла" я решил, тем, что тоже сделал зазор в один пиксел, но только с помощью этого плагина для GIMP'а
Добавлено (13 августа 2015, 13:10) --------------------------------------------- seaman, проблема в том, что у вас между тайлами есть щели в некоторых местах. Вот я и спрашиваю, как её решить? У меня сейчас точно такая же проблема.
Добавлено (13 августа 2015, 18:36) --------------------------------------------- Давайте пока проблему с щелями отложим. Искал я много в интернете, и пока ничего не нашёл.
Не нашёл я и решение следующей проблемы. Марио проваливается в предмет, то есть коллайдеры пересекаются и это здорово заметно:
Сообщение отредактировал 8Observer8 - Четверг, 13 Августа 2015, 22:00