1. Перписывай свои скрипты. Когда делаешь "по глупости" - рефакторь иначе потом сам запутаешься. 2. Я правильно понимаю что ты хочешь передавать "счет" ( монетки ) - своему герою или контроллеру. В общем, тот, кому ты передаешь существует в одном экземпляре? Если так то проблема решается синглетоном. ИЛИ Системой эвентов. 3. Не используй GetComponent в апдейте, Вообще в твоем случае апдейт не нужен. 4. Комментарии на русском - моветон. Старайся писать на инглише. Возможно завтра ты будешь работать с теми кто русского не знает. Английский - общепринятый язык. Не знаешь английского? Начни с него. Имхо одно из самых полезных знаний для программиста. Хотя бы потому что получишь доступ к информации напрямую, не дожидаясь случая переведут или нет. Я понимаю, ты скажешь, что это делаешь для себя и никто на это смотреть не будет, но надо себя тренировать.
Пример на синглетоне:
Shoot
Bomber
Так как у меня объект на сцене со скриптом shoot был назван GameObject то в дебагере пишется, что счет передался в GameObject. Так как добавил лог не по типу, а по объекту
Настоятельно рекомендую забить на создание игры на пару деньков ( Больше и не потребуется для твоего примера ) и почитать о программировании и попрактиковаться в юнити на очень простых и очевидных примерах. Пример выше - простейший. На эвентах и делегатах гораздо интереснее XDDD
Почему вся эта подготовка и хрень вообще важна если ты можешь УЖЕ сесть и писать гумнокод?
1. Будешь тратить три дня размышлений на что-то более важное и интересное. 2. Большая гибкость. У тебя завтра появятся ачивки и ты захочешь, чтобы N событий срабатывало при добавлении счета. Не через Go.GetComponent же делать. 3. Повышая читабельность кода меньше риск того, что через месяца два работы тебе не захочется все переписать 4. Игру легче поддерживать, расширять. 5. Количество багов снижается. 6. Над не мучаться, а получать удовольствие от процесса. Как его получать если все делается через пятую точку и работает на соплях?
Что тебе понадобится ? dotnetperls <= твоя C# библия с примерами. CofeeBreak <= простейшие игры-клоны сделанные на Unity3d. Код там показан и описан. Пошаговое создание крупной РПГ на unity3d <= Охватывает большинство вопросов которые у тебя вообще могут возникнуть по Unity + есть неплохие решения, паттерны.
Ну и все, что ты найдешь в гугле когда у тебя родятся вопросы после трех ссылок выше, а вопросов у тебя должно стать больше чем ответов. Разработчикам игр говорят думать о продукте ( игре ), не о технологии. Это верно. Для тех, у кого проблем с технологиями нет. Для тебя же важнее думать сейчас не что ты пишешь, а как ты пишешь. ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Сообщение отредактировал pixeye - Среда, 15 Июля 2015, 09:30
pixeye, спасибо гляну и уроки от BZA хоть они уже и устарели. я решил отложить до выходных все, что связано с проектом и переделать систему очков на похожую как PROJECT: SPACE SHOOTER http://www.falcogames.com/SnowCrushSetup.exe
Хде фаши доказательства? Дайте, пожалуйста, ссылочку на спецификацию.
Добавлено (15 июля 2015, 18:16) --------------------------------------------- http://answers.unity3d.com/questio....-1.html Это канеч не спецификация, но SubatomicHero разжевывает, а то какой-то совсем неструктурированный C# получается: хочу так трактую для. boolean, хочу так - для GO, для объекта ( Item'а в понимании ООП) как трактовать будем? true или !=null ?
Поторопился, не подумал. Мы оба не правы. Что делает иф? Он проверяет истинность выражения внутри скобок. Т.е. выражение внутри иф должно иметь тип bool. Т.к. там стоит GameObject компилятор пытается привести этот GameObject к типу bool и ему это удается! Почему? Потому что в классе UnityEngine.Object есть такое определение:
Оно позволяет неявно любой GameObject преобразовать в bool. Попробуй проделать тоже самое с другим классом, который не произведен от UnityEngine.Object. Например:
Код
public class Probe { } ... Probe p = new Probe(); if(p){} if(p == true){} // Так никто не пишет - это чушь....
Получишь в if ошибку. Почему? Потому что в классе Probe нет оператора преобразования в bool. На самом деле if(go) это сокращение от if((bool)go) ____ Однако говорить, что if(go) это сокращенное от if(go==true) это совсем неверно. Продолжи дальше: if(go==true) это сокращенное от if((go==true)==true) if((go==true)==true) это сокращенное от if(((go==true)==true)==true) и так до бесконечности. Не надо никакого сравнения с true. Определение if просто предполагает проверку на true выражения в скобках.
Сообщение отредактировал seaman - Среда, 15 Июля 2015, 19:31
да, правильней нам обоим было написать про проверку на истинность p.s. bool p=true; if(p) эквивалентно if(p==true) ? if(p==true) эквивалентно if((p==true)==true) ? и так до бесконечности? http://www.3dbuffer.com/ Текстуры, Unity3D, Blender: Эффекты, скрипты, моделирование, текстурирование, скульптинг VKонтакте 3Dbuffer
Бааа, промучился весь вечер так нечего не смог сделать. Помогите пожалуйста уже устал вариантов 20 перепробовал как сделать выкладываю два основных скрипта. Первый это скрипт сомалета который мы сбиваем и за его сбитие мы должны получать очки, второй скрипт в который я перенес вывод и типо подсчет очко в но не чего не работает выдает такую ошибку после сбития самолета :NullReferenceException: Object reference not set to an instance of an object bomber.Update () (at Assets/Scripts/bomber.cs:32). Я в принцепе все понял, что он хочет я все исправил и все равно не работает.
Код
using UnityEngine; using System.Collections;
public class bomber : MonoBehaviour {
public GameObject explusen;//партикл для взрыва public float bomberSpeed = 0.05f;//скорст сомалета public int enemy_Heath = 100;//жизни public int bomberDamage = 20;//урон по сомалету public int PointsValue;//количество очков за уничтожение private GameController gameController;
//public AudioClip Explous;//звук взрыва //public AudioClip fly_boart; // Use this for initialization void Start () { GameObject gameControllerObject = GameObject.FindGameObjectWithTag ("GameController"); if (gameControllerObject != null) { gameController = gameControllerObject.GetComponent<GameController>(); } if (gameController == null) { Debug.Log("Нет контролера!!!"); } transform.Rotate(0,90,0); }
using UnityEngine; using UnityEngine.UI; using System.Collections;
public class GameController : MonoBehaviour {
public GameObject Fe1421;//переменая для типа арага public Vector3 spawnValues;//точка респа в пространстве public int hazerdCout;//волны public float spawnWait; public float starWait; public float waveWait;
private int points; public Text point_text;
// Use this for initialization void Start () { points = 0; UpdatePoints (); StartCoroutine(SpawnWave ()); }
// Update is called once per frame void Update () {
}
IEnumerator SpawnWave(){
yield return new WaitForSeconds (starWait); while (true) { for(int i =0; i < hazerdCout; i++){ Vector3 spawnPosition = new Vector3 (spawnValues.x,spawnValues.y,Random.Range(-spawnValues.z, spawnValues.z)); Quaternion spawnRotation = new Quaternion (); Instantiate (Fe1421, spawnPosition, spawnRotation); } yield return new WaitForSeconds(waveWait); } }
public void AddScore(int newPointsValue){ points += newPointsValue; UpdatePoints (); }
Похоже что это не так - ничего не понял. Вот скажите - нафига еще раз получать GameController в строке: GetComponent<GameController>().AddScore(PointsValue); ? Вы что считаете, что этот скрипт висит на всех объектах? Или Вы не понимаете на каком объекте ищет компонент метод GetComponent? PS^ для кописатеров: замените GetComponent<GameController>().AddScore(PointsValue); на gameController.AddScore(PointsValue);