тогда лучше - второй вариант организации взаимодействий - убрать всю физику!
Тут тоже есть проблемы в поиске простого решения. Позже, как руки дойдут, подробнее опишу проблему или покажу простой пример. В кратце, использую OnTriggerStay2D, но при упорстве можно проехать поверх танка врага.
Сообщение отредактировал 8Observer8 - Среда, 19 Августа 2015, 09:02
На ассет стор есть отличный "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
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); } }
Может быть, действительно, баг. Я заметил, работает через раз. Если во время запуска кликать и нажимать W, то частенько начинает работать.
Добавлено (25 августа 2015, 14:37) --------------------------------------------- Я решил проблему. Просто во время загрузки приложения нужно кликать мышкой по сцене и нажимать W, тогда 100% начинает обрабатывтаь клавиши. Нужно только придумать, где руководство пользователя написать. Может исправят баг.
Сообщение отредактировал 8Observer8 - Вторник, 25 Августа 2015, 14:39
Он медленнее запускается. А в сентябре на 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):
Пссс, если вы хотите веб, почему не взяли нормальный хтмл5 движок?
Не на столько сильно я хочу веб. Посмотрю будет ли развиваться WebGL в Unity. Буду тестить от версии к верии. Если не будет развиваться и если Web Player выпилят из всех браузеров, то я просто буду собирать на что собирается без особых проблем.
Для меня пока это невозможно, так как я, как хобби, освоиваю туторы 3DMax+Unity и Maya+Unity от Digital Tutors. Я не встречал таких профессиональных туториалов по Blender+Unity. Я думаю, что те кто работал с этими редакторами вряд ли перейдут на Linux просто так. Хотя, я полагаю, возможен такой вариант, что программисты в компании будут работать на Linux, а 3D-моделисты на Windows.
Я понимаю, что это из-за безопасности. Но плеер же качественный и быстрый. Могли бы что-то другое придумать, чем выпиливать. Тогда пока плеер, жду выхода полноценного WebGL и собираю под ПК. Я бы с радость научился собирать под Android с Remote, но у меня его пока нет.
Сообщение отредактировал 8Observer8 - Пятница, 28 Августа 2015, 08:27
А макс не лучшее решение для разработки игр, поскольку запрещено его использовать для коммерции, а лицензия стоит дорого
Это дорого для инди-разработчика или малой команды. Я немного работал в одной компании C++ програмистом скады. Мне захотелось Unity, но у них JavaScript. У них штат более 50 человек. Делают виртуальные тренажёры для машинистов разных поездов и для разных химических заводов. У них множество отделов: и электронщики, которые кабины собирают, имитируя кабину поезда, и программисты на микроконтроллерах. Физики, химики и т.д. Так вот. Есть у них отделы программистов на Unity и моделисты. Такая компания покупает себе только лицензионное ПО. У них есть и Maya и 3D Max и Blender и т.д. Я мониторю вакансии на поиск такой немаленькой команды с опытом удалённо. Хочу быть готовым взаимодействовать c моделистами на платных редакторах. И Blender я тоже изучаю. Скачал для изучения студенческие версии на 3 года. Хотя может я и ошибаюсь и сейчас даже крупные компании используют только Blender.
Сообщение отредактировал 8Observer8 - Пятница, 28 Августа 2015, 09:54
Меня смущает, что Blender бесплатный. В моём представлении разработчики Blender развивают его бесплатно в свободное время, как хобби. А разработчики Maya и 3D Max - профессионально, это их работа. Другое дело Unity, в котором есть много плюшек в Pro версии и здесь работают тоже профессионалы, то есть за деньги.
Сообщение отредактировал 8Observer8 - Пятница, 28 Августа 2015, 10:30
Как раз таки от пользователей. Так как все их фильмы и игры были некоммерческими. Я прочитал на вики, что компания "Blender Foundation" имеет фонд, который пополняется за счёт пожертований. Скорее всего, им этого фонда вполне хватает, чтобы полноценно работать полный рабочий день, улучшая и развивая Blender, раз регулярно выходят обновления.
Сообщение отредактировал 8Observer8 - Пятница, 28 Августа 2015, 11:29
Как известно данные из COM-порта приходят асинхронно, то есть мы не знаем когда случится это событие. Unity не поддерживает событий. Можно ли организовать режим ожидания приёма данных какими-нибудь средствами Unity?