Клонируется персонаж при загрузке предыдущего уровня. Перехожу на новую сцену, потом возвращаюсь к старой - и на карте два персонажа. Как решить? Пользовался стандартным скриптом через Application.LoadLevel, и DontDestroy.
Забавно, если перейти на следующую локацию, то будет уже три игрока, четыре, и так далее...
Могу посоветовать два приема. Первый: Создаем нулевую сцену. В нее закладываем все объекты которые должны быть уникальными, но и быть во всех последующих сценах. Нашего персонажа в частности. Камеру стыдливо прикрываем загрузочным экраном, чтобы геймеры не знали откуда берутся персонажи. Всем нужным объектам назначаем DontDestroy. И только потом грузим первую игровую сцену. Естественно в ней персонажа уже не должно быть. Возвращаться в нулевую сцену нельзя, но возвраты в первую уже не навредят.
Второй, несколько более костыльно-кустарный, но без лишних сцен. Представь что ты и есть этот персонаж, ты приходишь в себя (Awake()), смотришь по сторонам, ищешь похожие объекты. Если никого не находишь, то ты и есть уникальный настоящий мальчик. Если находишь, еще и такого что себя считает настоящим, то понимаешь что ты клон, что места в жизни для тебя нет, печалишься, уходишь в депрессию, запой, и в конце концов заканчиваешь жизнь самоубийством (gameobject.Destroy();). Как найти, это уже дело техники, я например в редакторе создавал персонажа с названием PlayerCharNew. Если он не находил GameObject.Find ("PlayerChar"), то сам менял имя на PlayerChar, иначе убивался. Естественно будет много проблем если имя персонажа не уникальное. Но и там можно чтото придумать с флагами в скриптах или tag-ами.
А как задать несколько точек спавна на карте? Допустим, у меня есть одна большая локация - и в ней несколько поменьше. Как расставить точки спавна возле каждого входа отдельно? Больше никогда не буду делать игры.
Помогите ,пожалуйста, разобраться. Unity Free. Я делаю эквалайзер, скрипт читает аудио спектрум и правильно заносит все данные в массив, но когда дело доходит до увеличения объекта по оси Z, то тут(хоть объект и принимает в испекторе правильные значения) сам же объект похоже принимает значение равное нулю(по Z), хотя значение должно быть на уровне(как минимум) 1.6...
Код
using UnityEngine; using System.Collections;
public class Equalizer : MonoBehaviour { public AudioSource audio; public Color colorStart = Color.red; public Color colorEnd = Color.green; public float duration = 1.0f; public GameObject equalizer;
//public GameObject equalizer; public int channel = 0; public int numSamples = 64; public int freq = 1; public float[] power = new float[64]; // Use this for initialization void Start () { power = audio.GetSpectrumData(numSamples,channel,FFTWindow.BlackmanHarris); StartCoroutine("durator"); } void duratorStarter(){ StartCoroutine("durator"); } IEnumerator durator(){ print(freq); print(power[freq]); yield return new WaitForSeconds(duration); freq+=1; duratorStarter(); }
// Update is called once per frame void Update () { equalizer.transform.localScale = new Vector3(1, 1, power[freq]); } }
P.S. Проблема решена) Оказалось,что данные спектра были слишком малы даже для инспектора
Сообщение отредактировал Antonybae - Среда, 23 Июля 2014, 17:07
А как задать несколько точек спавна на карте? Допустим, у меня есть одна большая локация - и в ней несколько поменьше. Как расставить точки спавна возле каждого входа отдельно?
Хочется сказать " руками " или "клешнями"
Вопрос просто суперски понятный . Задай еще разок только на понятном
Вопрос просто суперски понятный . Задай еще разок только на понятном
На игроке висит скрипт, в котором прописаны координаты точек спавна для каждой локации. "Входя" через "дверь" (application.loadlevel) на новую локацию, он оказывается на конкретной точке (например, рядом дверью, которая согласно игровому миру, выходит в большой мир). Совсем как в Fallout или Skyrim. Но тут проблема - в скрипте могу прописать только по одной точке координат. А в одной локации "дверей" может быть много. Потому и спрашиваю, как прописать множество точек спавна, для каждого отдельного входа на локацию? Больше никогда не буду делать игры.
Но тут проблема - в скрипте могу прописать только по одной точке координат
можно попробовать сделать отдельный dont destroy скрипт для управления переходами между локациями, который бы и запускал loadlevel, вызывают запуски в нем пусть триггеры, расставленные в сценах, передавая текущее местонахождение игрока и название следующей сцены, которую надо загрузить. А в управляющем скрипте бы производилась выборка, в какую точку игрока кидать после загрузки, например можно использовать словарь (dictionary), где ключ будет string - название места триггера, а соответствующее ключу значение - transform, - кубик, точка спавна. Из локации ПЕЩЕРА, например, выходишь в локацию МИР - в скрипте вызывается загрузка уровня МИР а потом поиск по словарю ключа ПЕЩЕРА, и смотрим соответствующее значение - координату спавна.
Сообщение отредактировал GantZ_Yaka - Среда, 23 Июля 2014, 19:31
В общем .Все еще мучаюсь с вопросом о никах. Теперь сделал малость по другому . Теперь имя игрока отображается в GUIText . Так-же изменил проверку имени. Теперь что-бы увидеть имя луч должен попасть в объект с компонентом Name и там-же висит скрипт который отвечает за изменение имени но опять-же ничего у меня не вышло=(. Вот скрипты .
Он проверяет столкновение с объектом Name.
Код
using UnityEngine; using System.Collections;
public class GUI_Name : MonoBehaviour { public Transform Point; public GUIText PlayerName; public RaycastHit Hit; public string HitName; // Use this for initialization void Start () { PlayerName = GameObject.FindWithTag("PlayerName").GetComponent<GUIText>(); } // Update is called once per frame [RPC] void Update () { if(networkView.isMine){ Vector3 Direction = Point.TransformDirection(Vector3.forward); if(Physics.Raycast(Point.position, Direction, out Hit, 10000f)){ if(Hit.transform.GetComponent<Name>().GUI_Name){ HitName=Hit.transform.name; PlayerName.text=HitName; Hit.transform.networkView.RPC("SetName",RPCMode.AllBuffered,Hit.transform.name); }else{ if(!Hit.transform.GetComponent<Name>()){ PlayerName.text=""; } } } } } }
А этот назначает имя.
Код
using UnityEngine; using System.Collections;
public class Name : MonoBehaviour { public Transform OBJ; public string _NAME; public GUIText GUI_Name; // Use this for initialization void Start () {
} [RPC] // Update is called once per frame void Update () { GUI_Name = GameObject.FindWithTag("PlayerName").GetComponent<GUIText>(); } [RPC] void OnGUI(){ if (networkView.isMine) { _NAME=GUI.TextArea(new Rect(10,100,150,25),_NAME); OBJ.name=_NAME; } } [RPC] public void SetName(){ OBJ.name=_NAME; GUI_Name.text = OBJ.name; GUI_Name.text = _NAME; } }
Народ!Сделал уровень одной моделью,а деревья и камни раскидал уже в редакторе.Виснет,когда смотрю даже издалека на это все,когда отворачиваюсь,не виснет,на камере прорисовку не такую далекую даже поставил.Чего сделать?Скриптом отключать видимость объектор если далеко отошел?Дык даже когда среди деревьев хожу виснет.
Народ!Сделал уровень одной моделью,а деревья и камни раскидал уже в редакторе.Виснет,когда смотрю даже издалека на это все,когда отворачиваюсь,не виснет,на камере прорисовку не такую далекую даже поставил.Чего сделать?Скриптом отключать видимость объектор если далеко отошел?Дык даже когда среди деревьев хожу виснет.
graniza, Не полигонов не куча,модельки простые но их много,прочитал что нужно использовать CombineChildren,но у меня его в юнити нет.Сейчас ищу.
Добавлено (24.07.2014, 14:05) --------------------------------------------- Написал скрипт,который ищет объекты по тегам и скрывает их как только я отошел от них достаточно далеко.Draw calls уменьшилось,но еще не достаточно хорошо идет.