Вопрос-[ответ] по Unity
| |
QWER56 | Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Вопрос-[Ответ] по Unity3d
База скриптов Unity3d Курс Уроков по Unity 3D от Alcatraz
ConsMark - поисковик по интернет магазинам.
Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54 |
|
| |
DantorS | Дата: Суббота, 12 Июля 2014, 00:53 | Сообщение # 6281 |
заслуженный участник
Сейчас нет на сайте
| lentinant, raycastall проходит насквозь, через всю сцену - ну я так понял. Даже если я отделю все ненужные стены - как я определю точку соприкосновения со стеной
Добавлено (12.07.2014, 00:53) --------------------------------------------- Вопрос - как определить с какой стороны лепить декаль остаётся открытым
Сообщение отредактировал DantorS - Суббота, 12 Июля 2014, 01:00 |
|
| |
lentinant | Дата: Суббота, 12 Июля 2014, 05:54 | Сообщение # 6282 |
ленивый программист
Сейчас нет на сайте
| DantorS, вы что, на самом деле ничего не понимаете? Вот Пускаем рейкаст в сторону врага, сзади которого есть, припустим, две стены. RaycastAll получает точку столкновения (одну на объект, при выходе из объекта с обратной стороны мы не получаем столкновения) для каждого объекта, с которым столкнется (на рисунке - зеленые точки), и вся инфа о столкновении хранится в массиве типа RaycastHit. Координата столкновения хранится в переменной point этого класса, нормаль столкновения - в normal. Точка попадания во врага должна находиться ближе всего к игроку (у нас это а1), то есть, ее можно определить, пересмотрев все элементы массива и найдя тот, который ближе всего. А можно просто отсортировать, записав в виде Код а = Physics.RaycastAll(ray, raylength, layerMask2).OrderBy(h=>h.distance).ToArray(); Это для шарпа. Во всяком случае, элемент, отвечающий за стену за врагом - второй по порядку (на рисунке а2). Вам нужен только он, на все следующие точки столкновения (а3) вы можете просто забить. Смотрите, не слишком ли далеко находятся а1 и а2, и если они довольно близко, помещаете в точку а2 (что-то например a[1].point) декаль, повернув его соответственно нормали. Получить вращение с нормали можно как-то в стиле Код Quaternion.LookRotation(a[1].normal) Вот и все. Разве это так сложно, что нужно на пальцах объяснять?
Когда-то тут будут ссылки на крутые проекты. Или нет.
Сообщение отредактировал lentinant - Суббота, 12 Июля 2014, 05:55 |
|
| |
DantorS | Дата: Суббота, 12 Июля 2014, 07:09 | Сообщение # 6283 |
заслуженный участник
Сейчас нет на сайте
| lentinant, спасибо. P.S. С raycastall раньше не работал. Думал он на выходе выдаёт только объекты, а не ткоординаты столкновения.
|
|
| |
Adom | Дата: Суббота, 12 Июля 2014, 16:12 | Сообщение # 6284 |
Печенька!
Сейчас нет на сайте
| Эмм. А что это за ошибка ?
Код Sending RPC 'DamageGun_GR11' failed because the number of supplied parameters doesn't match the rpc declaration. Expected 0 but got 1 parameters. Код using UnityEngine; using System.Collections;
public class GR_11 : MonoBehaviour { public RaycastHit Hit; public AudioClip FireSound; public Transform Cam; public Transform bullet; public int BulletForce = 5000; public int CurAmmoCount = 100; public int MaxAmmoCount = 100; private float ReloadTimer = 0.0f; public bool Reload; public int AmmoBoxWidth = 20; //Ширина выводимого окна с информацией о кол-ве патронов public int AmmoBoxHeight = 100; //Высота выводимого окна с информацией о кол-ве патронов public int CurCatrige = 9; //Текущее число обойм private GunMode _gunMode;//Переменная с помощью которой мы выбираем режим стрельбы private float BurstTime = 0;//Переменная необходимая для таймера перезарядки public float BurstRate = 0.1f;//Переменная отвечающая за скорострельность public Transform MuzzleFlash; private float MuzzleFlashLifetime = 0.0f; public GUISkin Skin; public float Damage; // Use this for initialization enum GunMode{ //режим стрельбы single, //одиночный burst //очередь } void Start () { _gunMode = GunMode.single; // режим стрельбы одиночный MuzzleFlash.active = false; // вспышка невидима } // Update is called once per frame void Update () { if(networkView.isMine){ if(BurstTime > 0){ BurstTime -= Time.deltaTime; } if(Input.GetKeyDown(KeyCode.Q)){ switch (_gunMode){ case GunMode.single: _gunMode = GunMode.burst; break; case GunMode.burst: _gunMode = GunMode.single; break; } } if(Input.GetMouseButtonDown(0)&CurAmmoCount>0&ReloadTimer<=0&_gunMode == GunMode.single){ //Если нажата ЛКМ и кол-во патронов больше 0 и время перезарядки меньше или равно 0 и режим стрельбы одиночный Single(); } if(Input.GetMouseButton(0)&CurAmmoCount>0&ReloadTimer<=0&_gunMode == GunMode.burst&BurstTime <= 0){ //Если зажата ЛКМ и кол-во патронов больше 0 и время перезарядки меньше или равно 0 и режим стрельбы очередь и таймер очерди меньше или равно 0 Burst(); } Vector3 Direction = Cam.TransformDirection(Vector3.forward); if(Physics.Raycast(Cam.position, Direction, out Hit, 5000.0f)){ if(Hit.transform.name=="First Person Controller(Clone)"){ Hit.transform.networkView.RPC("DamageGun_GR11",RPCMode.AllBuffered,Hit.transform); Debug.Log("Hit"); } if(Hit.transform.GetComponent<HealthBox>().CurHealth<=0&&Hit.transform.name=="First Person Controller(Clone)"){ GameObject.FindWithTag("HealthBox").GetComponent<Skill>().CurLevel+=1; } if(Hit.transform.rigidbody&&Hit.collider.name=="Rigidbody"){ Hit.transform.rigidbody.AddForceAtPosition(Direction*1000, Hit.point); } // } if(Input.GetKey(KeyCode.R)&ReloadTimer<=0&&CurAmmoCount<MaxAmmoCount){ ReloadTimer = 1.5f; CurCatrige = CurCatrige - 1; //-1 обойма CurAmmoCount = MaxAmmoCount; //Число патронов в обойме = максимальному числу патронов Reload=true; }else{ Reload=false; } if(ReloadTimer>0){ ReloadTimer -= Time.deltaTime; } if(ReloadTimer>0){ ReloadTimer -= Time.deltaTime; //Переменная перезарядки уменьшается с течением времени } if(MuzzleFlashLifetime>0) { MuzzleFlashLifetime -= Time.deltaTime; //Переменная времени жизни вспышки уменьшается с течением времени } if(MuzzleFlashLifetime<=0){ //если время жизни вспышки больше 0 MuzzleFlash.active = false; // вспышка невидима } } } void OnGUI(){ if(networkView.isMine){ GUI.skin=Skin; GUI.Box(new Rect(Screen.width-200,0,200,100),""); //Вывод окна с инфой о патронах GUI.Label(new Rect(Screen.width-200,0,200,200),"Catrige:"+CurCatrige); //Вывод текста с инфой о обоймах GUI.Label(new Rect(Screen.width-200,25,200,200),"Ammo:"+CurAmmoCount+"/"+MaxAmmoCount); } } public void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info){ if(stream.isWriting){ // Выполняется у владельца networkview; // Сервер рассылает позицию по сети Vector3 pos = transform.position; stream.Serialize(ref pos);//"Кодирование" и рассылка }else{ // Выполняется у всех остальных; // Клиенты получают позицию и устанавливают ее Vector3 posReceive = Vector3.zero; stream.Serialize(ref posReceive); //"Декодирование" и прием transform.position = posReceive; } } void Single(){ Transform BulletInstance = (Transform)Network.Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity,0); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint" BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce" CurAmmoCount = CurAmmoCount - 1; //-1 патрон audio.PlayOneShot(FireSound); //проигрываем звук выстрела //вспышка от выстрела видна MuzzleFlash.active = true; //вспышка от выстрела видна MuzzleFlashLifetime = 0.1f; //установка времени жизни вспышки } void Burst(){ BurstTime = BurstRate;//Промежуток времени между стрельбой Transform BulletInstance = (Transform)Network.Instantiate(bullet, GameObject.Find("BulletSpawnPoint").transform.position, Quaternion.identity,0); //Генерится префаб патрона в координатах объекта "BulletSpawnPoint" BulletInstance.rigidbody.AddForce(transform.forward * BulletForce); //Сгенерированый патрон отправляется вперед со скоростью "BulletForce" CurAmmoCount = CurAmmoCount - 1; //-1 патрон audio.PlayOneShot(FireSound); //проигрываем звук выстрела //вспышка от выстрела видна MuzzleFlash.active = true; //вспышка от выстрела видна MuzzleFlashLifetime = 0.1f; //установка времени жизни вспышки } } Отсюда вот.
|
|
| |
Storm54 | Дата: Суббота, 12 Июля 2014, 18:02 | Сообщение # 6285 |
постоянный участник
Сейчас нет на сайте
| В ошибке все написано. Засунь в переводчик и почитай. И зачем кидать огромный кусок говно кода? Никто его не будет читать.
Если уж совсем все туго, то проблема здесь: Код Hit.transform.networkView.RPC("DamageGun_GR11",RPCMode.AllBuffered,Hit.transform); Ты отсылаешь 1 параметр, однако в объявленном RPC параметров 0.
|
|
| |
Adom | Дата: Суббота, 12 Июля 2014, 19:40 | Сообщение # 6286 |
Печенька!
Сейчас нет на сайте
| Цитата Storm54 ( ) Если уж совсем все туго, то проблема здесь: Я не настолько тупой как ты думаешь.Добавлено (12.07.2014, 19:40) --------------------------------------------- И еще одно. Что делать ? Просто кнопки и надписи наезжают друг на друга хотя не должны.
|
|
| |
allods | Дата: Суббота, 12 Июля 2014, 22:56 | Сообщение # 6287 |
почти ветеран
Сейчас нет на сайте
| Цитата Adom ( ) Что делать ? Сухари сушить
Сдвинуть их Я даже не знаю что добавить
Сообщение отредактировал allods - Суббота, 12 Июля 2014, 22:56 |
|
| |
Adom | Дата: Суббота, 12 Июля 2014, 23:35 | Сообщение # 6288 |
Печенька!
Сейчас нет на сайте
| А можно ли как-то в игре создать префаб и засунуть его в папку ? Т.е берутся определенные объекты для них создается префаб и он кидается в папку.
|
|
| |
lentinant | Дата: Воскресенье, 13 Июля 2014, 00:34 | Сообщение # 6289 |
ленивый программист
Сейчас нет на сайте
| Adom, PrefabUtility.CreatePrefab
Когда-то тут будут ссылки на крутые проекты. Или нет.
|
|
| |
richardknox | Дата: Воскресенье, 13 Июля 2014, 15:54 | Сообщение # 6290 |
был не раз
Сейчас нет на сайте
| Камера не вращается вокруг объекта альтом. Что делать?
|
|
| |
allods | Дата: Воскресенье, 13 Июля 2014, 17:53 | Сообщение # 6291 |
почти ветеран
Сейчас нет на сайте
| Чуть выше есть мой комент, посмотри.... Там чет про сухари я писал...
А вообще откуда мы знаем почему? Мы даже не знаем какой скрипт...
|
|
| |
Adom | Дата: Понедельник, 14 Июля 2014, 18:09 | Сообщение # 6292 |
Печенька!
Сейчас нет на сайте
| Я бы скинул но там ничего не прокомментировано и не понятно. Код using UnityEngine; using System.Collections;
public class GUIMenu : MonoBehaviour { /*Menu*/ public int Window; private int width = 1600; private int height = 900; private float Float_Resolution; private int IntResolution; private string Width_String; private string Height_String; public bool FullScreen=true; private float Float_Volume = 50; private int IntVolume; private string Volume_String; public GUISkin Skin; public Font []font; public Font NewFont; public float Button_Height; public float Button_Widht; public GameObject World; /*Server*/ public bool useNat; public string gameType; public string gameName; public int connectedPlayers; public int playerLimit; public string IP; public int port; public bool passwordProtected; public string comment; public string guid; /*Client*/ void Start () { Skin.font=NewFont; Skin.button.fontSize=15; Window = 1; } void Awake (){ MasterServer.RequestHostList("Fight"); } void Update(){ if(Input.GetKeyDown(KeyCode.Escape)){ Window=1; World.SetActive(false); World.GetComponent<WorldCreate>().enabled=false; Screen.showCursor=true; } } void OnGUI(){ GUI.skin=Skin; if(Window==1){ GUI.Box(new Rect(150,50,640,480),"Пауза"); if(GUI.Button(new Rect(150,25,125,75),"СозданиеМира")){ Window=11; } if(GUI.Button(new Rect(150,100,125,75),"Сервер&Клиент")){ Window=8; } if(GUI.Button(new Rect(150,175,75,75),"Опции")){ Window=2; } if(GUI.Button(new Rect(150,250,75,75),"Выход")){ Application.Quit(); } } if (Window == 11) { World.SetActive(true); World.GetComponent<WorldCreate>().enabled=true; } if(Window==2){ if(GUI.Button(new Rect(300,150,75,50),"Экран")){//Экран Window=3; } if(GUI.Button(new Rect(300,200,50,50),"Звук")){//Звук Window=4; } if(GUI.Button(new Rect(300,250,75,50),"Кнопки")){//Кнопки Window=6; } if(GUI.Button(new Rect(300,300,150,50),"Интерфейс")){//Интерфейс Window=7; } if(GUI.Button(new Rect(300,350,75,75),"Назад")){//Назад Window=1; } if(Input.GetKeyUp(KeyCode.Escape)){//Назад Window=1; } } if(Window==3){//Экран GUI.Box(new Rect(300,50,640,480),"Экран"); Float_Resolution = GUI.HorizontalSlider(new Rect(300,150,100,30),Float_Resolution, 0, 4); IntResolution = (int)Float_Resolution; // if(IntResolution==0){ width = 640; height = 480; Width_String = width.ToString(); Height_String = height.ToString(); } if(IntResolution==1){ width = 1024; height = 768; Width_String = width.ToString(); Height_String = height.ToString(); } if(IntResolution==2){ width = 1366; height = 768; Width_String = width.ToString(); Height_String = height.ToString(); } if(IntResolution==3){ width = 1600; height = 900; Width_String = width.ToString(); Height_String = height.ToString(); } GUI.Label(new Rect(430,145,100,25),Height_String); GUI.Label(new Rect(400,145,100,25),Width_String); FullScreen = GUI.Toggle (new Rect(300,180,180,30), FullScreen, "Полный Экран"); if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад Window=2; } } if(Window==4){ GUI.Box(new Rect(300,50,640,480),"Звук"); Float_Volume=GUI.HorizontalSlider(new Rect(300,150,100,30),Float_Volume,0,100); IntVolume=(int)Float_Volume; Volume_String=IntVolume.ToString(); GUI.Label(new Rect(400,145,100,25),Volume_String); if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад Window=2; } } if(Window==7){ GUI.Label(new Rect(450,50,150,50),"Цвета"); if(GUI.Button(new Rect(450,100,75,25),"Ченрый")){ Skin.button.normal.textColor=Color.black; Skin.label.normal.textColor=Color.black; } if(GUI.Button(new Rect(450,125,75,25),"Синий")){ Skin.button.normal.textColor=Color.blue; Skin.label.normal.textColor=Color.blue; } if(GUI.Button(new Rect(450,150,75,25),"Голубой")){ Skin.button.normal.textColor=Color.cyan; Skin.label.normal.textColor=Color.cyan; } if(GUI.Button(new Rect(450,175,75,25),"Серый")){ Skin.button.normal.textColor=Color.gray; Skin.label.normal.textColor=Color.gray; } if(GUI.Button(new Rect(450,200,75,25),"Пурпурный")){ Skin.button.normal.textColor=Color.magenta; Skin.label.normal.textColor=Color.magenta; } if(GUI.Button(new Rect(450,225,75,25),"Красный")){ Skin.button.normal.textColor=Color.red; Skin.label.normal.textColor=Color.red; } if(GUI.Button(new Rect(450,250,75,25),"Белый")){ Skin.button.normal.textColor=Color.white; Skin.label.normal.textColor=Color.white; } if(GUI.Button(new Rect(450,275,75,25),"Желтый")){ Skin.button.normal.textColor=Color.yellow; Skin.label.normal.textColor=Color.yellow; } if(GUI.Button(new Rect(450,300,75,25),"Зеленый")){ Skin.button.normal.textColor=Color.green; Skin.label.normal.textColor=Color.green; } if(GUI.Button(new Rect(450,325,75,75),"Назад")){//Назад Window=2; } GUI.Label(new Rect(600,50,150,50),"Шрифт"); if(GUI.Button(new Rect(600,100,50,25),"0")){ Skin.font=font[0]; Skin.button.fontSize=15; } if(GUI.Button(new Rect(600,125,50,25),"1")){ Skin.font=font[1]; Skin.button.fontSize=10; } if(GUI.Button(new Rect(600,150,50,25),"2")){ Skin.font=font[2]; Skin.button.fontSize=15; } if(GUI.Button(new Rect(600,175,50,25),"3")){ Skin.font=font[3]; Skin.button.fontSize=15; } if(GUI.Button(new Rect(600,200,50,25),"4")){ Skin.font=font[4]; Skin.button.fontSize=11; } if(GUI.Button(new Rect(600,225,50,25),"5")){ Skin.font=font[5]; Skin.button.fontSize=12; } if(GUI.Button(new Rect(600,250,50,25),"6")){ Skin.font=font[6]; Skin.button.fontSize=12; } if(GUI.Button(new Rect(600,275,50,25),"7")){ Skin.font=font[7]; Skin.button.fontSize=10; } if(GUI.Button(new Rect(600,300,50,25),"8")){ Skin.font=font[8]; Skin.button.fontSize=15; } if(GUI.Button(new Rect(600,325,50,25),"9")){ Skin.font=font[9]; Skin.button.fontSize=13; } if(GUI.Button(new Rect(600,350,50,25),"10")){ Skin.font=font[10]; Skin.button.fontSize=15; } } if(Window==6){ if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад Window=2; } } if(Window==8){ if(GUI.Button(new Rect(150,400,75,75),"Назад")){//Назад Window=1; } if(GUI.Button(new Rect(150,250,75,75),"Сервер")){ Window=9; } if(GUI.Button(new Rect(150,325,75,75),"Клиент")){ Window=10; } } if(Window==9){ GUI.Box(new Rect(190,0,175,250),"ServerSettings"); GUI.Label(new Rect(200,25,150,25),"GameType"); gameType=GUI.TextArea(new Rect(202.5f,50,150,25),gameType); // GUI.Label(new Rect(200,75,150,25),"Comment"); comment=GUI.TextArea(new Rect(202.5f,100,150,25),comment); // GUI.Label(new Rect(200,125,150,25),"GameName"); gameName=GUI.TextArea(new Rect(202.5f,150,150,25),gameName); // guid=Network.player.guid; if(GUI.Button(new Rect(202.5f,175,150,50),"Start Server")){ Network.InitializeServer(32, 25002, Network.HavePublicAddress()); MasterServer.RegisterHost(gameType,gameName,comment); enabled=false; } if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад Window=8; } } if (Window == 10) { HostData[] data = MasterServer.PollHostList(); foreach(var element in data){ GUILayout.BeginHorizontal(); name=element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit; string hostInfo; hostInfo = "["; foreach(var host in element.ip) hostInfo = hostInfo + host + ":" + element.port + " "; hostInfo = hostInfo + "]"; // GUI.Box(new Rect(0,0,175,250),"Clent"); GUI.Label(new Rect(0,25,150,50),hostInfo); GUI.Label(new Rect(155,25,150,50),"-Ip"); // GUI.Label(new Rect(95,50,150,50),"-ServerName"); GUI.Label(new Rect(0,50,150,50),element.comment); // GUI.Label(new Rect(125,75,150,50),"-Players"); GUI.Label(new Rect(0,75,150,50),name); // if(GUI.Button(new Rect(0,175,175,50),"Connect")){ enabled=false; Network.Connect(element); } if(GUI.Button(new Rect(300,220,75,75),"Назад")){//Назад Window=8; } GUILayout.EndHorizontal(); } } } } Вот=)Добавлено (14.07.2014, 18:09) --------------------------------------------- Пока вы не ответили на предыдущий вопрос задам еще один. Есть игрок и есть его оружие сначала все хорошо каждый игрок стреляет своим оружием. Но когда A-Игрок умирает то он стреляет уже не из своего оружия а из оружия B-Игрока. Хотя сам префаб игрока не уничтожался а просто выключился и включился . Что делать ? Если нужно то могу предоставить код стрельбы.
|
|
| |
richardknox | Дата: Понедельник, 14 Июля 2014, 21:07 | Сообщение # 6293 |
был не раз
Сейчас нет на сайте
| Вы меня не так поняли когда я закидываю в юнити объект то вокруг него нельзя вращаться и двойное нажатие мышкой в иерархии не работает
|
|
| |
Adom | Дата: Понедельник, 14 Июля 2014, 21:43 | Сообщение # 6294 |
Печенька!
Сейчас нет на сайте
| richardknox, Эмм. не знаю . Единственное что приходит в голову что у тебя стоит галочка static это гд название объекта чуть ниже и правее.
|
|
| |
beril | Дата: Понедельник, 14 Июля 2014, 23:18 | Сообщение # 6295 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Можно ли сделать так, что бы когда запустил приложение в инспекторе, при изменении значений переменных, они сохранялись после того когда останавливаешь игру?
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
allods | Дата: Вторник, 15 Июля 2014, 02:02 | Сообщение # 6296 |
почти ветеран
Сейчас нет на сайте
| Цитата beril ( ) Можно ли сделать так, что бы когда запустил приложение в инспекторе, при изменении значений переменных, они сохранялись после того когда останавливаешь игру? Только скопировать и вставить после того как остановил , я думаю только так
|
|
| |
JonLivingston | Дата: Вторник, 15 Июля 2014, 16:08 | Сообщение # 6297 |
почетный гость
Сейчас нет на сайте
| Как отключить управление движением FPSКонтроллера (стандартного) при столкновении с триггером?
Сейчас делаю это так:
Код void OnTriggerEnter(Collider cube) { if(cube.collider.tag == "Player") { //motor - объект стандартного CharacterMotor
motor.movement.maxForwardSpeed = 0; motor.movement.maxSidewaysSpeed = 0; motor.movement.maxBackwardsSpeed = 0; } }
Но сея конструкция работает, только если в зоне триггера отпустить клавишу движения (дать контроллеру остановиться). Иначе игрок просто пробегает ее.
"Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах Наша первая игра Dark Forest Let's play на Dark Forest
Сообщение отредактировал JonLivingston - Вторник, 15 Июля 2014, 16:10 |
|
| |
Voresh | Дата: Вторник, 15 Июля 2014, 21:14 | Сообщение # 6298 |
частый гость
Сейчас нет на сайте
| Добрый день. Подскажите, пожалуйста, как лучше реализовать стрельбу в 2d пространстве? При нажатии ПКМ, я спавню снаряд(геймобжект). Его надо занести в массив снарядов. В ф-ции апдейта двигать массив снарядов и если какой-то из них сталкивается с препятствием или улетает за конец экрана, то ячейку массива надо почистить. А как работать с этими дырами в массиве? Как его сортировать? Куда потом заносить переменную нового снаряда? Подскажите, пожалуйста, статьи на эту тему. И, неплохо бы что-то про динамическое выделение памяти. Спасибо
|
|
| |
JonLivingston | Дата: Вторник, 15 Июля 2014, 22:21 | Сообщение # 6299 |
почетный гость
Сейчас нет на сайте
| Voresh, советую почитать про пул объектов. Например, здесь. Если я правильно понял проблему. А вообще, зависит от очень многих факторов (конкретных примеров кода, который ты используешь).
А если в общем, пробегаешь циклом foreach по динамическому List массиву, и если obj.isDeative, Remove() его или в стартовую позицию. Ну, в общем, нужно смотреть на конкретном примере, как это у тебя работает.
"Почему труднее всего на свете заставить птицу поверить в то, что она свободна?" - Ричард Бах Наша первая игра Dark Forest Let's play на Dark Forest
Сообщение отредактировал JonLivingston - Вторник, 15 Июля 2014, 22:31 |
|
| |
lentinant | Дата: Среда, 16 Июля 2014, 22:40 | Сообщение # 6300 |
ленивый программист
Сейчас нет на сайте
| Voresh, во первых, довольно глупо двигать снаряды с одного скрипта. Проще сделать скрипт снаряда, который будет отвечать именно за этот снаряд (мол, выстрелили - теперь ты сам по себе). Тогда, в принципе, и в массив ничего заносить не нужно.
Если же вам, все таки, нужен массив (например, ограничение количества одновременно созданных снарядов), тогда вы можете использовать списки (List для C#, ArrayList для JavaScript), в них уже предусмотрены методы для извлечения элемента с автоматической сортировкой. Тогда вы просто при создании снаряда кешируете в его скрипте объект, которым создаете снаряды, и в коде уничтожения снаряда просто вызываете метод извлечения экземпляра.
Когда-то тут будут ссылки на крутые проекты. Или нет.
|
|
| |
|