Есть конструкция (2D массив) состоящая из блоков, размером например 5Х5. В центре блок-ядро (core), и несколько обычных блоков вокруг него. Мне нужно пустить волну, от ядра, и проверить целостность этой конструкции. А все отстающие от общей конструкции блоки занести в массив. Допустим ядро на координатах 2:2, то есть в центре, и ещё три блок, первый на 2:0, второй на 2:1, и третий на 2:4. Пускаем волну от ядра в четырёх направлениях, получаем второй блок, пускаем ещё раз, далее получаем первый, третий блок волна не заденет никак. Теперь вопросы: 1.Как мне реализовать этот алгоритм так, что бы блоки не проверялись по два раза, это возможно? 2.Как мне узнать какие блоки остались не задетыми волной? 3.Эту операцию мне нужно будет проводить часто, возможно есть менее затратный способ?
Распишите пожалуйста всё подробно, заранее спасибо!
Сообщение отредактировал SmallNibbler - Понедельник, 25 Июля 2016, 18:53
Доброго времени суток, уже третий день ломаю голову, как мне сделать правильную загрузку аудио файлов с жесткого диска и их воспроизведение. У меня есть три класса: Первый - базовый:
Код
using UnityEngine;
public class BaseClass : MonoBehaviour { GameObject gObject; AudioSource audioSource;
void Start() { gObject = new GameObject("Audio"); gObject.transform.position = new Vector3(0,0,-9.5f);
Пробовал перестраивать скрипт по всякому, ничего не получается. Мне нужно что бы в одном классе(ResourceManager) находился файл, после этого из другого класса вызывалась функция предзагрузки аудио, и как он загрузиться этот AudioClip отправлялся сначала в ResourceManager, а из него уже в базовый класс, присваивался источнику аудио, и воспроизводился.
А у меня получается что куротина не тормозит исполнение скрипта в общем а только в своем теле, а на источник сразу же отправляется не загруженный аудио файл.
Помогите, как быть?
Добавлено (22 марта 2016, 12:23) --------------------------------------------- Я разобрался, всё оказалось гораздо проще:
Код
public static AudioClip LoadAudioClip(string path) { string file = Directory.GetFiles(rootPath + path, Path.GetFileName(path))[0]; var www = new WWW("file://" + file); while (!www.isDone); return www.GetAudioClip(false, true, AudioType.OGGVORBIS); }
Просто не додумался что у класса WWW свой поток. Подскажите, такой способ не будет сильно тормозить игру если проигрывать все звуки(выстрелы, шаги, эмбиент и др.) из папки?
Метод LoadAudioClip находится в статическом классе. Проблема в том что я "загружаю" аудио клип и сразу же хочу воспроизвести его в стрим режиме, но аудио клип не успевает прогрузиться и вылетает ошибка:
Код
Error: Cannot create FMOD::Sound instance for resource ȜB, (Operation could not be performed because specified sound/DSP connection is not ready. ) UnityEngine.WWW:GetAudioClip(Boolean, Boolean) ResourceManager:LoadAudioClip(String) (at Assets/ResourceManager.cs:25) BaseClass:Update() (at Assets/BaseClass.cs:31)
Я нашел решение в виде использования куротины, но меня оно не устраивает, подскажите есть ли другой способ?
Доброго времени суток, хочу обрести знания в создании поддержки моддов для игры, и одним из немаловажных пунктов есть загрузка, в скомпилированном проекте, спрайтов из папки в корне проекта. Что то вроде UnityEditor.AssetDatabase.LoadAssetAtPath<T>() метода, а то с этим методом проект отказывается компилироваться, что логично.
Доброго времени суток. Возникла проблема, сейчас опишу её.
Есть объект "Родитель", на который я добавляю компонент, условно назовем его "Создатель", который создает, дочерний к объекту "Родитель", объект, назовем его "Ребенок". "Создатель" так же вешает на объект "Ребенок" - компонент, назовем его "Компонент". ВСЁ ЭТО ПРОИСХОДИТ В РЕДАКТОРЕ! Проблема в том что не инициализируются данные компонента "Компонент", пока не нажму на объект на котором он висит ("Ребенок") в иерархии.
Вопрос, если я добавляю компонент В РЕДАКТОРЕ посредством вызова AddComponent в другом скрипте, то при добавлении компонента, как мне вызвать метод из этого же компонента?
Сообщение отредактировал SmallNibbler - Вторник, 20 Октября 2015, 19:11
Здравствуйте, моя проблема в том что кнопка работает как то не правильно, она должна выполнять, при нажатии первый раз - одно действие, а при следующем - другое. Но она при первом нажатии выполняет первое действие, при втором нажатии тоже первое действие, при третьем нажатии второе действие, после чего цикл повторяется. С точки зрения логики, мне кажется что, всё правильно, но я не понимаю в чем проблема. Код:
Код
using UnityEngine; using UnityEditor; using System.Collections; using System.Collections.Generic;
[ExecuteInEditMode] [CustomEditor(typeof(ComponentsOldManager))] public class ComponentsManagerOldEditor : Editor { bool isShowed = true;
string text; string s = "True"; string h = "False";
[ExecuteInEditMode] public sealed class ComponentsOldManager : MonoBehaviour {
public Entity entity;
public void ShowComponents(bool boolean) { Component[] c = GetComponents<Component> (); for (int i = 0; i < c.Length; i++) if (!(c [i] is Transform) && !(c [i] is ComponentsOldManager) && !(c [i] is Entity)) { if(boolean) c[i].hideFlags = HideFlags.None; else c[i].hideFlags = HideFlags.HideInInspector; } } }
Просто создайте объект, и поместите в него этот компонент, и ещё какой нибудь, и нажмите кнопку.
Путем комментирования кода, я выяснил что проблема в этом куске кода:
Код
Component[] c = GetComponents<Component> (); for (int i = 0; i < c.Length; i++) if (!(c [i] is Transform) && !(c [i] is ComponentsOldManager) && !(c [i] is Entity)) { if(boolean) c[i].hideFlags = HideFlags.None; else c[i].hideFlags = HideFlags.HideInInspector; }
Добавлено (04 октября 2015, 20:39) --------------------------------------------- Нашел причину, переменная isShowed должна быть в class ComponentsOldManager.
Извиняюсь, проблема была мною решена, простите за бессмысленное создание темы.
Здравствуйте, подскажите пожалуйста, где же я ошибся? Ошибка возникает при нажатии на кнопки в инспекторе, только если по условию нужно удалить компоненты. Вот код:
Код
Удален
А это лог ошибки:
Цитата
MissingReferenceException: The object of type 'SpriteRenderer' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object. UnityEditor.Editor.IsEnabled () (at C:/buildslave/unity/build/Editor/Mono/Inspector/Editor.cs:554) UnityEditor.InspectorWindow.DrawEditor (UnityEditor.Editor editor, Int32 editorIndex, Boolean forceDirty, System.Boolean& showImportedObjectBarNext, UnityEngine.Rect& importedObjectBarRect, Boolean eyeDropperDirty) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:1082) UnityEditor.InspectorWindow.DrawEditors (UnityEditor.Editor[] editors) (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:969) UnityEditor.InspectorWindow.OnGUI () (at C:/buildslave/unity/build/Editor/Mono/Inspector/InspectorWindow.cs:350) System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)
Сообщение отредактировал SmallNibbler - Пятница, 02 Октября 2015, 15:09
Да видел эту тему, но тогда не уделил ей должного внимания. Вот этот скрипт работает на ура, только его нужно переписать под компоненты. Спасибо огромное, с меня причитается плюс.
Код
using UnityEngine; using System.Collections.Generic;
namespace de.softfun.drawntogether { public class EnhancedBehavior : MonoBehaviour { private List<GameObject> linkedObjects = new List<GameObject>();
public void LinkObjects(params GameObject[] objects) { foreach (GameObject o in objects) { linkedObjects.Add(o); } }
void OnDestroy() { foreach (GameObject o in linkedObjects) { destroy(o); } }
protected T instantiate<T>(T prefab, bool addLink = true) where T : Object { T o = (T)Instantiate(prefab); if (addLink && (o is GameObject)) { linkedObjects.add(o); } return o; }
} }
Добавлено (28 сентября 2015, 17:13) --------------------------------------------- А нет, поспешил с выводами, ошибка не исчезла. Она возникает при нажатии кнопки play. Подскажите boolean переменную которая показывает воспроизведена игра или нет, думаю это исправит проблему.
Добавлено (28 сентября 2015, 17:26) --------------------------------------------- Попробовал Application.isPlaying не помогает. Насколько я понимаю когда в инспекторе нажимается Remove Component то вызывается метод OnDestroy(), и мне нужно как то при нажатии Remove Component делать DestroyImmediate, но в OnDestroy() не получается, потому что при запуске игры и её остановки вылазят ошибки. Подскажите решение.
Добавлено (28 сентября 2015, 18:12) --------------------------------------------- Нашел решение:
Код
using UnityEngine; using System.Collections; using UnityEditor;
[ExecuteInEditMode] public class Test : MonoBehaviourEnhanced {
Написал добавление используемого компонента, при добавлении компонента использующего компонента в инспектор, и удаление используемого компонента, при удалении использующего компонента. Если не понятно, то вот скрипт:
Код
using UnityEngine; using System.Collections;
[ExecuteInEditMode] public class Test : MonoBehaviour {
Destroying object multiple times. Don't use DestroyImmediate on the same object in OnDisable or OnDestroy. UnityEngine.Object:DestroyImmediate(Object) Test:OnDestroy() (at Assets/Test.cs:14)
Вообще цель этого скрипта, это добавлять компонент SpriteRenderer когда я добавляю скрипт в инспектор, и удалять его когда я удаляю скрипт. Атрибут RequireComponent не предлагать, потому что я использую HideFlags.HideInInspector, по этому когда я удаляю скрипт, компонент остается на объекте и его не как не убрать.
Как мне быть? Заранее спасибо!
Сообщение отредактировал SmallNibbler - Воскресенье, 27 Сентября 2015, 20:40
Пpиходит как-то Леpмонтов на бал и видит, что на входе швейцаp не пускает сильно пьяного Пушкина. Решил тогда Леpмонтов помочь дpугу и говоpит: - Ты, бpат Пушкин, жди меня у окна возле убоpной, я пpойду на бал, откpою тебе сие окно, ты пеpелезешь, и мы с тобой отоpвемся! - Спасибо дpуг, я в долгу не останусь! Пpоходит Леpмонтов на бал и откpывает окно, как и обещал. Вдpуг объявляют белый вальс, и Леpмонтова пpиглашает Hаташа Ростова. Во вpемя танца Hаташа обнаpуживает, что у паpтнеpа pасстегнута шиpинка, но не знает, как покоppектнее сообщить ему об этом: - Михаил... у вас... окно откpыто! - Hу так я же его наpочно и откpыл! Сейчас оттуда вылезет мой кучеpявый дpуг, и мы с ним кpуто отоpвемся!!
Ахах
Сообщение отредактировал SmallNibbler - Пятница, 11 Сентября 2015, 12:45
Здравствуйте, 2 часа проломал голову с одной проблемой, но хотелось бы понять из за чего она произошла. Вопрос: У меня есть префаб в котором есть public поле, я в него через инспектор забиваю GameObject. И во время игры когда я создаю инстанс этого префаба, то это поле оказывается пустым, почему так происходит? (Если что в public GameObject поле я пробывал забивать и инстанс из редактора и префаб, результат один.)
Добрый день, у меня возникла проблема, сейчас постараюсь кратко описать. Когда я пытаюсь использовать анимацию с root motion для того чтобы уменьшить персонажа ровно на половину, то в режиме игры scale по y уменьшается правильно ровно до 0.5(как и должно быть), а transform по y для того что бы персонаж оставался на земле уменьшается не до конца остается примерно 0.2 единицы, и это уже довольно критично, и бросается в глаза, подскажите в чем может быть проблема?
Сообщение отредактировал SmallNibbler - Суббота, 22 Августа 2015, 12:30
Доброго времени суток. Начал реализовывать защиту игры, сам впервые этим занимаюсь, так что нашел статью на хабре http://habrahabr.ru/post/249681/. Но автор не привел примера использования его скриптов, пришлось немного поломать голову, но я почти со всем разобрался, кроме одного. Вот скрипт:
Код
using System; using System.IO; using System.Security.Cryptography; using System.Text;
namespace Assets.Scripts.Common { /// <summary> /// AES (Advanced Encryption Standard) implementation with 128-bit key (default) /// - 128-bit AES is approved by NIST, but not the 256-bit AES /// - 256-bit AES is slower than the 128-bit AES (by about 40%) /// - Use it for secure data protection /// - Do NOT use it for data protection in RAM (in most common scenarios) /// </summary> public static class AES { public static int KeyLength = 128; private const string SaltKey = "ShMG8hLyZ7k~Ge5@"; private const string VIKey = "~6YUi0Sv5@|{aOZO"; // TODO: Generate random VI each encryption and store it with encrypted value
public static string Encrypt(byte[] value, string password) { var keyBytes = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(SaltKey)).GetBytes(KeyLength / 8); var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros }; var encryptor = symmetricKey.CreateEncryptor(keyBytes, Encoding.UTF8.GetBytes(VIKey));
using (var memoryStream = new MemoryStream()) { using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) { cryptoStream.Write(value, 0, value.Length); cryptoStream.FlushFinalBlock(); cryptoStream.Close(); memoryStream.Close();
public static string Decrypt(string value, string password) { var cipherTextBytes = Convert.FromBase64String(value); var keyBytes = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(SaltKey)).GetBytes(KeyLength / 8); var symmetricKey = new RijndaelManaged { Mode = CipherMode.CBC, Padding = PaddingMode.None }; var decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.UTF8.GetBytes(VIKey));
using (var memoryStream = new MemoryStream(cipherTextBytes)) { using (var cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) { var plainTextBytes = new byte[cipherTextBytes.Length]; var decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
Метод Encrypt требует два параметра, первый понятно для чего, но не совсем понятно для чего второй. Как я понял это пароль, можете мне разжевать его использование, пожалуйста?