но бывают случаи когда этот объект может быть уничтожен
Если объект уничтожается, который вошёл, то не понятно почему анимация такая же, как после выхода. В любом случае, используй OnDestroy или OnDisable, они вызываются перед удалением объекта. То есть, если ты крутил анимацию в OnTriggerExit, дублируешь код анимации в один из этих обработчиков.
также предполагал мб батчикг есть, если запихать всё в один Canvas
Если перекладывать элементы без установленного материала в разные Canvas, то увеличивается только Batches в окне статистики, но SetPass calls остаются на месте. Вот если использовать материалы, тогда с одним Canvas меньше SetPass.
Сообщение отредактировал Lertmind - Воскресенье, 17 Апреля 2016, 03:06
Я так понял, что ты хочешь экстраполировать движение объекта, чтобы узнать возможные столкновения, но выполнить код, если прогнозируемого столкновения не случилось? Это очень странно. Либо объясни лучше, либо расскажи какой эффект тебе нужен, возможно ты пытаешься решить задачу не тем способом.
Ты ведь понимаешь, что это будет неудобно? Придётся каждый кадр вычислять относительную позицию и синхронизировать с элементом у Canvas, а если полоска жизни зависит от дальности камеры, то придётся ещё и размер менять в зависимости от расстояния. То есть у тебя прибавятся код и вычисления, но сэкономишь возможно несколько килобайт.
GameCoder123, это ветка уже устарела и решение не актуально. Способ из твоего "P.S." я писал на форуме Unity http://forum.unity3d.com/threads....2415582, в vk только перевели, и он нужен был только для первой версии 5.3 и только для x86 систем.
// Создание двумерного квадратного массива double **array_generator(unsigned int size) { double **ptrary = new double*[size]; for (int i = 0; i < size; i++) { ptrary[i] = new double[size]; } return ptrary; }
// Удаление массива void array_destroyer(double **array, unsigned int size) { for (int i = 0; i < size; i++) { delete [] array[i]; } delete [] array; }
// Вывод массива на экран void print_array(double** array, int size, int width) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { cout << setw(width) << array[i][j] << ','; } cout << endl; } }
// Перемножение диагонали double mul(double** array, int size) { double m = 1; for (int i = 0; i < size; i++) { m *= array[i][i]; } return m; }
// Сумма положительных чисел double sum(double** array, int size) { double s = 0; for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { if (array[i][j] > 0) { s += array[i][j]; } } } return s; }
// Транспонирование double tran(double** array, int size) { for (int i = 1; i < size; i++) { for (int j = 0; j < i; j++) { double tmp = array[i][j]; array[i][j] = array[j][i]; array[j][i] = tmp; } } }
"Разработать программу сложной модульной структуры", ахаха.
ЦитатаJHawk ()
С борландом никогда не работал
При чём здесь борланд? Ты просто не умеешь программировать на C или C++, потому что для такой элементарной задачи специфичного для борланда практически нет, кроме того, что он древний.
Для начала сожги всё, что написал. FixedJoint здесь вообще не сдался. Если хочешь как у Lego, то надо как раз по сетки, только размер сетки это выступ у блока. Посмотри их программу для создания. Если хочешь прикреплять их в любом месте на грани, то это уже не Lego, а просто блок на блоке, но без физики.
Я писал "Хотя я бы код добавления коллайдера вынес в метод, который бы вызывал через скрипт MouseClick". Вот как стоит делать:
Код
// ClickManager.cs вместо неуместного названия Scripts.cs using UnityEngine; using System.Collections;
public class ClickManager : MonoBehaviour { public GameObject[] players; // Нужно присвоить объекты через Inspector или другой код private int boxIndex = 0;
void Awake() { AddNextCollider(); }
public void AddNextCollider() { if (boxIndex < players.Length) { var boxCol = players[boxIndex].AddComponent<BoxCollider2D>(); boxCol.size = new Vector2(7, 7); boxIndex++; } } }
Код
// MouseClick.cs using UnityEngine; using System.Collections;
public class MouseClick : MonoBehaviour { void OnMouseDown() { Destroy(GetComponent<BoxCollider2D>()); var cm = Object.FindObjectOfType<ClickManager>(); // Работает если ClickManager один cm.AddNextCollider();
Debug.Log(name + " has been clicked"); } }
Добавлено (10 апреля 2016, 17:53) --------------------------------------------- Animator добавишь сам. ClickManager можно сделать синглтоном (Singleton).
Сейчас проверил, всё работает как должно. Только стоит учитывать: порядок объектов, которые у тебя в "player", может отличаться от желаемого; Input.GetMouseButtonDown срабатывает при любом нажатии на экран, поэтому на следующий объект BoxCollider2D вешается даже если не была клика на предыдущем BoxCollider2D.
Косяки: * Видны стыки между платформами. * Когда нажимается кнопка паузы, главный герой не должен прыгать. * Иногда все подбираемые предметы резко меняют положение. * Когда ГГ врезается в лёд, то эффект исчезновения оставляет сначала куски облачков и через промежуток времени целое облако. Кроме этого восстанавливаются подбираемые предметы. Эффект от взрыва ракеты тоже стоило бы довести до конца. * Если подобран магнит, после смерти подбираемые предметы всё равно притягиваются.
Добавлено (10 апреля 2016, 04:01) --------------------------------------------- * Необходим индикатор бонуса, если с "крыльями" и "магнитом" видно, то с "двойным прыжком" не понятно когда бонус отключился. Например, круглая иконка бонуса с круговой полоской таймера в левом верхнем углу.
public class Scripts : MonoBehaviour { public GameObject ofp; private BoxCollider2D boxCol; public GameObject[] player; private int boxIndex = 0;
void Awake() { player = GameObject.FindGameObjectsWithTag("Player"); for (int i = 0; i < 5; i++) { Debug.Log("Player Number " + i + " is named " + player[i].name); } }
void Update() { if (Input.GetMouseButtonDown(0)) { boxIndex++; if (boxIndex < player.Length) { boxCol = player[boxIndex].AddComponent<BoxCollider2D>(); boxCol.size = new Vector2(7, 7); } } } }
Хотя я бы код добавления коллайдера вынес в метод, который бы вызывал через скрипт MouseClick, а ещё лучше через делегаты/события.
Сообщение отредактировал Lertmind - Воскресенье, 10 Апреля 2016, 02:56
Когда ты запускаешь консольное приложение кликая по exe-файлу, чтобы окно не закрылось нужно ожидать ввода. В Pascal это можно сделать с помощью ReadLn, например:
Код
const Pi = 3.1415;
var r: real; // радиус круга S: real; // площадь круга begin write('Введите радиус круга: '); readln(r); S := Pi*r*r; writeln('Площадь круга равна ',S); writeln('Нажми Enter'); readln; end.
Фразу "Программа завершена, нажмите любую клавишу . . ." и ожидание делает среда разработки для тебя.
Сообщение отредактировал Lertmind - Воскресенье, 10 Апреля 2016, 01:48