|
Общие вопросы вопросы не попадающие ни в один из доступных разделов |
05.08.2014, 00:04
|
#106
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Я снова со своими тупыми вопросами.
Продолжаю делать скрипт камеры. Поставило в тупик следующее:
public void Camera_SlideCalc () {
SlideVector = Vector3.zero;
CameraTarget.position = Vector3.SmoothDamp(CameraTarget.position,CameraTarget.position+SlideVector,ref velocity,2f);
private Vector3 velocity = Vector3.zero;
По логике если стартовая точка и конечная совпадает (т.к. прибавляется нулевой вектор) то движения не должно быть, а оно есть. Больше никаких источников возникновения движения нет. Если комментирую строчку со SmoothDamp то движение исчезает.
Всю голову поломал, видимо что-то опять недопонимаю...
может velocity обнулять нужно после вызова функции?
upd:
сократил функцию до вида, проблема осталась:
public void Camera_SlideCalc () {
CameraTarget.position = Vector3.SmoothDamp(CameraTarget.position,CameraTarget.position,ref velocity,2f);}
такое ощущение, что я не до конца понял принцип работы SmoothDamp. Почему если начало и конец движения равны движение все равно есть?
Последний раз редактировалось EvilOkta, 05.08.2014 в 00:20.
Причина: добавление
|
(Offline)
|
|
05.08.2014, 07:54
|
#107
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
Ты двигаешь цель, а камера как движется?
|
(Offline)
|
|
05.08.2014, 12:17
|
#108
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
камера наследует движение от цели как дочерний объект, пробовал вместо трансформа цели поставить трансформ камеры - то же самое.
Вот код целиком. Функция подобного движения активируется при долгом нажатии на левую кнопку мыши. Все действия в функциях с пометкой Slide
using UnityEngine; using System.Collections; using System.Collections.Generic; public class CameraNavigation : MonoBehaviour { public Transform CameraTransform; //основа навигации камеры public Transform CameraTarget, CameraRotate, CameraView; //цель камеры public Transform Cursor; public Camera RealCamera; private float Speed, SpeedX, SpeedY, RealSpeedX, RealSpeedY, SpeedXFrom, SpeedYFrom; // эталонная скорость по координатам, реальная скорость, слепки для скорости public int ScreenWidth, ScreenHeight; // размеры экрана public bool inInertia; //инерция камеры public List<float> Borders = new List<float>(); //список экранных маркеров public enum GetBordersInfo {None,Left,Right,Up,Down,UpLeft,UpRight,DownLeft,DownRight}; // присвоение попавшей рамки private GetBordersInfo BordersInfo, BordersInfoSave; //контейнер для хранения маркеров и слепка маркеров public float InertiaTime, InertiaTimeScale, SlideTime, SlideTrigger; // время инерции и скорость инерции public enum SlideStatus {Idle,Calc,Run}; // стадия слайда public SlideStatus ActiveSlideStatus; const float ScreenPercent = 0.01f; // размер рамки public float MouseXCord, MouseYCord, MouseX, MouseY; // данные о мыши public Vector3 MoveVector, SlideVector, SlideMem,SlideStart; //вектор перемещения, вектор скольжения,вектор слепка, вектор старта скольжения public Vector2 StartSlidePos,SlidePos; public float RotSpeed, ZoomDistance, Zooming, SlideSpeed; // скорость вращения private float SlideSecond; private Vector3 velocity = Vector3.zero; public Ray Position_on_plane; public RaycastHit RayInfo; public Vector3 PointRay, CursorPosition; void Start () { Screen.showCursor = true; ScreenWidth = Screen.width; ScreenHeight = Screen.height; // размеры экрана CameraTransform = transform; // трансформации камеры для перемещения Speed = 0.1f; // скорость движения камеры RotSpeed = 100f; SlideSpeed = 10f; InertiaTimeScale = 3f; // скорость движения во время инерции SlideTrigger = SlideSecond = 0.2f; // время включения режима скольжения, частота съема слепка для слайда в секундах inInertia = false; ActiveSlideStatus = SlideStatus.Idle; Borders.Add ((float)ScreenWidth*ScreenPercent); // 0 - слева Borders.Add ((float)ScreenWidth*(1-ScreenPercent)); // 1 - справа Borders.Add ((float)ScreenHeight*ScreenPercent); // 2 - сверху Borders.Add ((float)ScreenHeight*(1-ScreenPercent)); // 3 - снизу CameraTarget.position = new Vector3(0,0,0); // установка цели камеры CameraView.position = new Vector3 (0,0,-5); // установка расстояния до цели CameraRotate.position = CameraTarget.position; // выравнивание позиции цели и основы вращения CameraRotate.rotation = CameraTarget.rotation; // выравнивание вращения цели и основы вращения RotateCamera(); // запуск ограничителя высоты поворота } // Update is called once per frame void Update () { MouseX = Input.GetAxis("Mouse X"); // отклонение мыши Х MouseY = Input.GetAxis("Mouse Y"); // отклонение мыши У Zooming = Input.GetAxis("Mouse ScrollWheel"); Camera_Navigation(); } public void CheckInBorders () { // проверка попадания в рамки MouseXCord = Input.mousePosition.x; MouseYCord = Input.mousePosition.y; // координаты мыши if (!inInertia) { // если работает инерция то BordersInfoSave = BordersInfo; // сделать слепок текущего квадрата экрана if ((MouseXCord <= Borders[0])&&(BordersInfo != GetBordersInfo.Left)) BordersInfo = GetBordersInfo.Left; // мышь в левой части if ((MouseXCord >= Borders[1])&&(BordersInfo != GetBordersInfo.Right)) BordersInfo = GetBordersInfo.Right; // мышь в правой части if ((MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.Down)) BordersInfo = GetBordersInfo.Down; // мышь в нижней части if ((MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.Up)) BordersInfo = GetBordersInfo.Up; // мышь в верхней части if ((MouseXCord <= Borders[0])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpLeft)) BordersInfo = GetBordersInfo.UpLeft; // Лево-вверх if ((MouseXCord >= Borders[1])&&(MouseYCord >= Borders[3])&&(BordersInfo != GetBordersInfo.UpRight)) BordersInfo = GetBordersInfo.UpRight; // Право-вверх if ((MouseXCord <= Borders[0])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownLeft)) BordersInfo = GetBordersInfo.DownLeft; // Лево-Вниз if ((MouseXCord >= Borders[1])&&(MouseYCord <= Borders[2])&&(BordersInfo != GetBordersInfo.DownRight)) BordersInfo = GetBordersInfo.DownRight; // Право-Вниз if ((MouseXCord >= Borders[0])&&(MouseXCord <= Borders[1])&&(MouseYCord >= Borders[2])&&(MouseYCord <= Borders[3])&&(BordersInfo != GetBordersInfo.None)) BordersInfo = GetBordersInfo.None; // Курсор в центральной части } if (BordersInfoSave != BordersInfo) { // при смене квадрата SpeedXFrom = SpeedX; SpeedYFrom = SpeedY; // начальное значение скорости inInertia = true; // включить инерцию InertiaTime = 0f; // запустить таймер инерции ChangeSpeed (); // расчитать конечную скорость BordersInfoSave = BordersInfo; // сохранить текущий квадрат } if (inInertia) { // если инерция включена InertiaTime += Time.deltaTime; // отчет времени RealSpeedX = Mathf.Lerp(SpeedXFrom, SpeedX, InertiaTime*InertiaTimeScale); // плавное изменение скорости Х RealSpeedY = Mathf.Lerp(SpeedYFrom, SpeedY, InertiaTime*InertiaTimeScale);// плавное изменение скорости У if ((RealSpeedX == SpeedX)&&(RealSpeedY == SpeedY)) inInertia = false; // если скорость достигнута - отключить инерцию } } public void ChangeSpeed () { // изменение скорости switch (BordersInfo) { // куда перешел курсор мыши case GetBordersInfo.Left: SpeedX = -Speed; SpeedY = 0f; // значения скорости break; case GetBordersInfo.Right: SpeedX = Speed; SpeedY = 0f; // значения скорости break; case GetBordersInfo.Up: SpeedY = Speed; SpeedX = 0f; // значения скорости break; case GetBordersInfo.Down: SpeedY = -Speed; SpeedX = 0f; // значения скорости break; case GetBordersInfo.UpLeft: SpeedX = -Speed; SpeedY = Speed; // значения скорости break; case GetBordersInfo.DownLeft: SpeedX = SpeedY = -Speed; // значения скорости break; case GetBordersInfo.UpRight: SpeedX = SpeedY = Speed; // значения скорости break; case GetBordersInfo.DownRight: SpeedX = Speed; SpeedY = -Speed; // значения скорости break; case GetBordersInfo.None: SpeedX = SpeedY = 0f; // значения скорости break; } } public void CheckKeyBoardRule () { // управление с клавиатуры if (BordersInfo == GetBordersInfo.None) { if (Input.GetKey(KeyCode.LeftArrow)) BordersInfo = GetBordersInfo.Left; if (Input.GetKey(KeyCode.RightArrow)) BordersInfo = GetBordersInfo.Right; if (Input.GetKey(KeyCode.UpArrow)) BordersInfo = GetBordersInfo.Up; if (Input.GetKey(KeyCode.DownArrow)) BordersInfo = GetBordersInfo.Down; if (Input.GetKey(KeyCode.LeftArrow)&&Input.GetKey(KeyCode.UpArrow)) BordersInfo = GetBordersInfo.UpLeft; if (Input.GetKey(KeyCode.LeftArrow)&&Input.GetKey(KeyCode.DownArrow)) BordersInfo = GetBordersInfo.DownLeft; if (Input.GetKey(KeyCode.RightArrow)&&Input.GetKey(KeyCode.UpArrow)) BordersInfo = GetBordersInfo.UpRight; if (Input.GetKey(KeyCode.RightArrow)&&Input.GetKey(KeyCode.DownArrow)) BordersInfo = GetBordersInfo.DownRight; ChangeSpeed (); // изменить скорость } } public void RotateCamera() { if (Input.GetMouseButton(1)) { // если нажата правая кнопка мыши CameraRotate.Rotate (-MouseY*RotSpeed*Time.deltaTime,0f,0f); // вращать по Х if (MouseYCord>ScreenHeight/2f) CameraTransform.Rotate (0f,-MouseX*RotSpeed*Time.deltaTime,0f); // вращать по У в верхней половине экрана else CameraTransform.Rotate (0f,MouseX*RotSpeed*Time.deltaTime,0f); // вращать по У в нижней половине экрана } CameraRotate.eulerAngles = new Vector3 (Mathf.Clamp(CameraRotate.rotation.eulerAngles.x,30f,80f),CameraRotate.eulerAngles.y,CameraRotate.eulerAngles.z); // ограничители } public void ChangeMove (GetBordersInfo InBorders) { switch (InBorders) { case (GetBordersInfo.Left): CameraTransform.Translate(0f,0f,MouseY*Time.deltaTime*2f); break; case (GetBordersInfo.Right): CameraTransform.Translate(0f,0f,MouseY*Time.deltaTime*2f); break; case (GetBordersInfo.Up): CameraTransform.Translate(MouseX*Time.deltaTime*2f,0f,0f); break; case (GetBordersInfo.Down): CameraTransform.Translate(MouseX*Time.deltaTime*2f,0f,0f); break; } } public void Camera_zoom () { ZoomDistance = Mathf.Clamp(Vector3.Distance(CameraView.transform.position,CameraRotate.transform.position),2f,10f); if ((ZoomDistance<10f)&(ZoomDistance>2f)) CameraView.Translate (Vector3.forward*Zooming); if ((Zooming<0f)&(ZoomDistance==2f)) CameraView.Translate (Vector3.forward*Zooming); if ((Zooming>0f)&(ZoomDistance==10f)) CameraView.Translate (Vector3.forward*Zooming); } public void Camera_SlideCalc () { //SlideVector = Vector3.zero; CameraTransform.position = Vector3.SmoothDamp(CameraTransform.position,CameraTransform.position,ref velocity,2f); if (Input.GetMouseButtonUp(0)) { ActiveSlideStatus = SlideStatus.Run; SlideTime = 0f; SlideTrigger = SlideSecond; } } public void Camera_Navigation() { CheckInBorders(); // - проверка попадания в рамки CheckKeyBoardRule (); // - управление c клавиатуры if (BordersInfo == GetBordersInfo.None) RotateCamera(); // вращение только в центральной области игры MoveVector = new Vector3(RealSpeedX,0,RealSpeedY); //вектор перемещения CameraTransform.Translate (MoveVector); //перемещаем камеру в соответствии со скоростями ChangeMove(BordersInfo); // расчет скоростей Camera_zoom(); // Зум Camera_SetPosition_on_plane (); if (Input.GetMouseButton(0)&(ActiveSlideStatus==SlideStatus.Idle)) SlideTime += Time.deltaTime; // если слайда нет, то включить слайд через 0.2 сек if (SlideTime > SlideTrigger) // готовимся сделать слайд { SlideStart = Cursor.position; // слепок текущего положения SlideTime = 0f; // обнулить таймер ActiveSlideStatus = SlideStatus.Calc; // начать расчет слайда } if (ActiveSlideStatus==SlideStatus.Calc) Camera_SlideCalc(); // расчет слайда if (ActiveSlideStatus==SlideStatus.Run) Camera_SlideRun(); } public void Camera_SlideRun() { ActiveSlideStatus = SlideStatus.Idle; } public void Camera_SetPosition_on_plane () { Position_on_plane = RealCamera.ScreenPointToRay(new Vector3(MouseXCord,MouseYCord,0f)); // пусить луч в координаты мыши if (Physics.Raycast(Position_on_plane, out RayInfo, Mathf.Infinity)) // если пересечение то { PointRay = RayInfo.point; // получаем информацию о столкновении CursorPosition = new Vector3(Mathf.Round(PointRay.x),0f,Mathf.Round(PointRay.z)); //позиция курсора на плоскости } Cursor.position = Vector3.SmoothDamp(Cursor.position,CursorPosition,ref velocity,0.1f); // плавно переместить курсор в точку назначения } }
|
(Offline)
|
|
05.08.2014, 14:04
|
#109
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Передача переменной в метод
У тебя там кажется влияет
Speed = 0.1f; // скорость движения камеры
Пртестировать не могу, не понял зачем столько полей у скрипта
|
(Offline)
|
|
05.08.2014, 14:35
|
#110
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
разобрался, оказывается конфликтовали две velocity из разных частей кода. Я использовал один и тот же контейнер для хранения - видимо это и давало искажение.
|
(Offline)
|
|
26.03.2015, 00:20
|
#111
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Вопрос на логику кода, читал сегодня справки, думал над реализацией.
В общем висит у меня на камере метод, отвечающий за тряску камеры.
Хочу разобраться как лучше реализовать следующую логику:
Метод тряски могут вызывать разные игровые объекты и события (взрывы, падения, повреждение и т.п) из собственных скриптов.
Самый простой способ как я понял это отправка сообщений на активацию скрипта из других с помощью getComponent.
Появился вопрос следующий, в методе есть возможность задавать длительность тряски с помощью переменной. Как реализовать установку длительности тряски из тех скриптов которые будут вызывать этот метод?
Через getComponent смысл понятен, просто сначала посылать в скрипт значение продолжительности тряски и затем активировать его.
Рассматриваю вариант с подпиской метода на события, но мне кажется это слишком запутывает задачу (или нет - подскажите?) тогда событие, которое активирует метод должно задать ему длительность. Как это реализовать? Сориентируйте как должен выглядеть скрипт чтобы в него можно было передавать длительность (shakeOver) из других скриптов, которые вызывают событие.
Интересует изменение метода ShakeIsDo (), как его доработать? Надеюсь правильно объяснил вопрос.
Не пинайте в справки, я просто опять упускаю какую-то базовую концепцию ООП. Отправлять в метод/функцию объект для его модификации и возврата с помощью return я разобрался, а тут требуется void но с заданным параметром, которым управляют другие объекты, совершенно разного типа.
public class CameraShake : MonoBehaviour { public Transform CameraTransform; public bool isShake, shakeRun; public float shakeAmount, shakeOver, shakeTime, shakeTimeStop; public Vector3 OriginalPos,ShakePos,ShakeVector; void Start () { isShake = false; shakeRun = false; shakeAmount = 0.1f; shakeOver = 0.1f; } void Update() { if ((Input.GetKey(KeyCode.Space))) { isShake = true; shakeTime = 0f; OriginalPos = CameraTransform.position; shakeRun = true; } if ((Input.GetKey(KeyCode.B))) { isShake = false; shakeTime = 0f; CameraTransform.position = OriginalPos; } if (shakeRun) ShakeIsDo(); } public void ShakeIsDo () { ShakePos = CameraTransform.position; ShakeVector = Random.insideUnitSphere * shakeAmount; ShakeVector = new Vector3(0f,ShakeVector.y,0f); CameraTransform.position = new Vector3(ShakePos.x,ShakePos.y+ShakeVector.y,ShakePos.z); if (((ShakePos.y-OriginalPos.y)>shakeOver)||((ShakePos.y-OriginalPos.y)<-shakeOver)) CameraTransform.position = new Vector3(ShakePos.x,OriginalPos.y,ShakePos.z); shakeTime += Time.deltaTime; if (shakeTime >= shakeOver) shakeRun = false; } }
в коде есть дублирующие переменные isShake и ShakeRun не обращайте внимание, вырезал части - немного другой подход был сначала.
|
(Offline)
|
|
26.03.2015, 06:46
|
#112
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Передача переменной в метод
Можно сделать через getComponent, ведь ты по сути получаешь этим способом экземпляр класса и можешь вызывать любой метод.
Делаешь public метод ShakeStart с нужными параметрами, как минимум с параметром shakeOver
public void ShakeStart(float shakeOver) { this.shakeOver = shakeOver; shakeTime = 0f; OriginalPos = CameraTransform.position; isShake = true; }
далее из других скриптов получаешь экземпляр и вызываешь метод
CameraShake shaker = camera.GetComponent<CameraShake>(); shaker.ShakeStart(2.5f);
Если время тряски фиксировано для разных случаев, то можно сделать константы (static readonly) в классе CameraShake и использовать их, например
shaker.ShakeStart(CameraShake.DELAY_FOR_EXPLOSION);
тогда не придётся по коду искать интервалы тряски, можно будет изменять в одном месте.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
26.03.2015, 10:25
|
#113
|
Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Передача переменной в метод
Ещё: чтобы каждый раз не доставать экземпляр скрипта через
CameraShake shaker = camera.GetComponent<CameraShake>();
можно сделать статическую переменную в классе CameraShake и статический метод тряски, и обращаться напрямую через имя класса:
private static CameraShake Instance; void Awake() { Instance = this; } private void ShakeStartLocal(float shakeOver) { this.shakeOver = shakeOver; shakeTime = 0f; OriginalPos = CameraTransform.position; isShake = true; } public static void ShakeStart(float shakeOver) { Instance.ShakeStartLocal(shakeOver); } ............ CameraShaker.ShakeStart(0.5f);
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
07.04.2015, 22:19
|
#114
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Жека огромное спасибо, все доходчиво! На основе советов сделал целый класс который передается в функцию с разными наборами параметров для тряски, не только длительность но и другие
)).
Сейчас встал в ступор снова. Задача, рейкастом выделить объекты на плоскости. Написал код, рейкаст исправно отрисовывает курсор в месте пересечения, но ни в какую не ловит объекты, которые на нем расположены. В чем беда? Layer стоит у объектов Default
using UnityEngine; using System.Collections;
public class SelectUnit : MonoBehaviour {
public Transform Cursor; public Camera RealCamera; public float MouseXCord, MouseYCord; private Vector3 velocityCur = Vector3.zero; public Ray Position_on_plane; public RaycastHit RayInfo; public Vector3 PointRay, CursorPosition; public GameObject Unit_was_Hit; void Start () { } void Update () { MouseXCord = Input.mousePosition.x; MouseYCord = Input.mousePosition.y; SetPosition_on_plane (); Analize_Hit_Unit (); } public void SetPosition_on_plane () { Position_on_plane = RealCamera.ScreenPointToRay(new Vector3(MouseXCord,MouseYCord,0f)); // пусить луч в координаты мыши if (Physics.Raycast(Position_on_plane, out RayInfo, Mathf.Infinity)) // если пересечение то { PointRay = RayInfo.point; // получаем информацию о столкновении CursorPosition = new Vector3(Mathf.Round(PointRay.x),0f,Mathf.Round(PointRay.z)); //позиция курсора на плоскости } Cursor.position = Vector3.SmoothDamp(Cursor.position,CursorPosition,ref velocityCur,0.1f); // плавно переместить курсор в точку назначения } public void Analize_Hit_Unit () { if (RayInfo.transform!=null) Unit_was_Hit = (GameObject)RayInfo.collider.gameObject; // вот тут происходит поиск объекта } }
Пробовал информацию доставать и из коллайдера и из трансформа, результат такой же.
|
(Offline)
|
|
07.04.2015, 23:59
|
#115
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
Жека огромное спасибо, все доходчиво! На основе советов сделал целый класс который передается в функцию с разными наборами параметров для тряски, не только длительность но и другие
)).
Сейчас встал в ступор снова. Задача, рейкастом выделить объекты на плоскости. Написал код, рейкаст исправно отрисовывает курсор в месте пересечения, но ни в какую не ловит объекты, которые на нем расположены. В чем беда? Layer стоит у объектов Default
Пробовал информацию доставать и из коллайдера и из трансформа, результат такой же.
|
У меня показывает с каким объектом пересечение. Проверь если ли коллайдер у выделяемых объектов и не стоит ли на них "IsTrigger".
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
08.04.2015, 09:41
|
#116
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от Nex
У меня показывает с каким объектом пересечение. Проверь если ли коллайдер у выделяемых объектов и не стоит ли на них "IsTrigger".
|
спасибо )) нашел проблему! Оказалось size у коллайдеров почему-то сбросился на 0, вот рейкаст их и не видел. Сейчас все заработало! Спасибо!))
|
(Offline)
|
|
08.04.2015, 22:14
|
#117
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Есть какая-нибудь альтернатива использовать GameObject.FindGameObjectsWithTag для заполнения списка List<>, а не массива []? Делаю через промежуточный массив, но понимаю что тем самым удваиваю нагрузку на память.
public List<GameObject> UnitList = new List<GameObject>(); public GameObject[] UnitsInScene; void Start () { UnitsInScene = GameObject.FindGameObjectsWithTag("Unit Player"); for (int i=0; i<=UnitsInScene.Length; i++) {UnitList.Add (UnitsInScene[i]);} }
Код работает как надо, но ищу вариант составления списка юнитов сразу в List (ибо массив динамический и методы нужны). Есть такие способы?
|
(Offline)
|
|
08.04.2015, 22:56
|
#118
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Передача переменной в метод
Сообщение от EvilOkta
Есть какая-нибудь альтернатива использовать GameObject.FindGameObjectsWithTag для заполнения списка List<>, а не массива []?
|
Возможно так
UnitList.AddRange(GameObject.FindGameObjectsWithTag("Unit Player"));
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.04.2015, 13:57
|
#119
|
Знающий
Регистрация: 31.07.2008
Сообщений: 321
Написано 108 полезных сообщений (для 229 пользователей)
|
Ответ: Передача переменной в метод
Ребят, посоветуйте книги/статьи/материалы которые можно почитать по системам событий, делегатам, подпискам и синглтонам. Вчера уперся в стену в скрипте, понял что без понимания этих механизмов дальше в разработке не продвинусь, так как сложность взаимодействия скриптов друг с другом растет в геометрической прогрессии, а getcomponent на каждый чих скрипта делать накладно )))
Хочу разобраться в простейшем примере, уже поставил задачу. Смысл такой - есть список объектов. Нужно создать событие (выделение конкретного объекта мышкой), на которое подпишутся все остальные объекты и проделают у себя манипуляции со своими скриптами.
Читал пару статей на хабре, но не могу в голове уложить алгоритм - где объявлять издателя, где производить подписку, какая роль статических классов и методов во всем этом.
В общем что посоветуете? MDSN уже почитал - для восприятия сложно.
|
(Offline)
|
|
09.04.2015, 22:45
|
#120
|
Мастер
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений (для 790 пользователей)
|
Ответ: Передача переменной в метод
http://gameprogrammingpatterns.com/contents.html
Можно каждую главу отдельно от других читать, написано довольно хорошо и понятно (на мой взгляд). Ещё по паттернам читал книгу "банды четырёх", но не впечатлился.
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 08:58.
|