Вопрос-[ответ] по Unity
| |
QWER56 | Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1 |
старожил
Сейчас нет на сайте
| Вопрос-[Ответ] по Unity3d
База скриптов Unity3d Курс Уроков по Unity 3D от Alcatraz
ConsMark - поисковик по интернет магазинам.
Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54 |
|
| |
Antrix | Дата: Среда, 08 Июля 2015, 08:48 | Сообщение # 7101 |
почетный гость
Сейчас нет на сайте
| x_Medwed Кидаешь на сцену ThirdPersonController, в него добавляешь камеру. Камеру сделать main camera и настроить положение как тебе удобно.
|
|
| |
Vip_and_Rip | Дата: Четверг, 09 Июля 2015, 16:37 | Сообщение # 7102 |
почетный гость
Сейчас нет на сайте
| Можно-ли вынести сообщения из Log.Debag в GUI, сделать подобие журнала событий? Допустим, клик - сообщение "Персонаж <name> идет к..." или "Персонаж <name> вступает в бой с..." ? В смысле, что-бы это отображалось в самой игре, а не консоли Unity.
Больше никогда не буду делать игры.
Сообщение отредактировал Vip_and_Rip - Четверг, 09 Июля 2015, 16:39 |
|
| |
beril | Дата: Четверг, 09 Июля 2015, 17:45 | Сообщение # 7103 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Можно тык или можешь мою модификацию, которой я пользовался когда в не Pro версии нельзя было к билду консоль подключать
Работает с UI в переменную TextBox закидываешь свой Text (куда будет инфа выводиться)
обращаться к консоли для вывода DebugConsole.Log(1 параметр текст сообщения, тип(каким цветом выведется сообщение)); кроме сообщения консоль выводит имя скрипта, класса и метода с которого вызывалась
Код using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Diagnostics; using System;
/* * Debug консоль для тестов в готовом билде */
public class DebugConsole : MonoBehaviour {
private static DebugConsole _debug; public static DebugConsole _Debug { get { return _debug; } } public Text TextBox;
public bool DebugLogVis;
private string textBuild; private string compareString; private string output = ""; private string stack = "";
void Awake() { _debug = this; }
void Update() { if (_debug.TextBox.text.Length >= 14000) { _debug.TextBox.text = null; }
if (Input.GetKeyDown(KeyCode.E)) {
} }
#region Метод Callback
void OnEnable() { Application.logMessageReceived += HandleLog; }
void OnDisable() { Application.logMessageReceived -= HandleLog; }
void HandleLog(string logString , string stackTrace , LogType type) { output = logString; stack = stackTrace; if (type == LogType.Error || type == LogType.Exception || type == LogType.Warning) { Log(output + " " + stack , 3); } } #endregion
/// <summary> /// Вывод сообщений в консоль /// </summary> /// <param name="message">текст сообщения</param> /// <param name="type">вид(цвет)</param> public static void Log(string message , int type) { StackTrace stackTrace = new StackTrace();
if (_debug.DebugLogVis) UnityEngine.Debug.Log(message);
switch (type) { case 0://обычный текст
if (_debug.TextBox.text.IndexOf(message) > -1) { return; } else { _debug.textBuild = string.Format("<color=lightblue>\n{0}</color>" + "<color=#0000ffff>(Class: {1}.cs, Method: {2})</color>" , message , stackTrace.GetFrame(1).GetMethod().ReflectedType , stackTrace.GetFrame(1).GetMethod().Name); _debug.compareString = message;
_debug.TextBox.text += _debug.textBuild;
_debug.textBuild = null;
} break; case 1://текст квестов и т.д if (_debug.TextBox.text.IndexOf(message) > -1) { return; } else { _debug.textBuild = string.Format("<color=orange>\n{0}</color>" + "<color=#0000ffff>(Class: {1}.cs, Method: {2})</color>" , message , stackTrace.GetFrame(1).GetMethod().ReflectedType , stackTrace.GetFrame(1).GetMethod().Name);
_debug.compareString = message;
_debug.TextBox.text += _debug.textBuild;
_debug.textBuild = null; } break; case 2://особый текст if (_debug.TextBox.text.IndexOf(message) > -1) { return; } else { _debug.textBuild = string.Format("<color=green>\n{0}</color>" + "<color=#0000ffff>(Class: {1}.cs, Method: {2})</color>" , message , stackTrace.GetFrame(1).GetMethod().ReflectedType , stackTrace.GetFrame(1).GetMethod().Name);
_debug.compareString = message;
_debug.TextBox.text += _debug.textBuild;
_debug.textBuild = null; } break; case 3://повышеное внимание if (_debug.TextBox.text.IndexOf(message) > -1) { return; } else { _debug.textBuild = string.Format("<color=red>\n{0}</color>" + "<color=#0000ffff>(Class: {1}.cs, Method: {2})</color>" , message , stackTrace.GetFrame(1).GetMethod().ReflectedType , stackTrace.GetFrame(1).GetMethod().Name);
_debug.compareString = message;
_debug.TextBox.text += _debug.textBuild;
_debug.textBuild = null; } break; } } }
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
ivan2009 | Дата: Четверг, 09 Июля 2015, 20:25 | Сообщение # 7104 |
частый гость
Сейчас нет на сайте
| Здравствуйте. Начал изучать юнити совсем недавно,так что если кому то мои вопросы покажутся нубскими, уж извиняйте... Хочу сделать контроллер перемещения объекта с помощью мышки,самый простой, что бы кубик передвигался(пока без анимации ) по платформе по клику ЛКМ в указанное место. Шастал по просторам гугла, читал описания, даже нашел готовый скрипт(правда на устаревший юнити, у меня 5.1.1). В общем все что смог пока родить Код using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag;
// Use this for initialization void Start () { player = (GameObject)this.gameObject; //playerPos = player.transform.position;
}
// Update is called once per frame void Update () { mousePos = Input.mousePosition; if (Input.GetMouseButton (0)) { ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ Debug.Log ("MOUSE POS -> " + mousePos); //mag = (transform.position - hit.point).magnitude; //player.transform.position = Vector3.MoveTowards(player.transform.position, hit.point, mag); //player.transform.position = new Vector3(hit.point.x, transform.position.y , hit.point.z); //player.transform.position += hit.point*speed*Time.deltaTime; Debug.Log("NEW PLAYER POS -> " + player.transform.position);
} }
} } И вот какие незадачи... если подключаю в первом варианте mag = (transform.position - hit.point).magnitude; player.transform.position = Vector3.MoveTowards(player.transform.position, hit.point, mag); - то кубик мгновенно появляется в точке hit.point и начинает взлетать по оси У. во втором player.transform.position = new Vector3(hit.point.x, transform.position.y , hit.point.z); - то кубик мгновенно появляется в точке hit.point, если зажать ЛКМ и подвигать мышкой, то дублирует координаты курсора. в третьем player.transform.position += hit.point*speed*Time.deltaTime; - то кубик движется в hit.point пока зажата кнопка ЛКМ, а иногда движется и не туда А мне бы хотелось сделать так что при нажатии ЛКМ(одном клике) кубик с определенной скоростью передвигался в точку hit.point, но пока что видать не хватает в голове нужных знаний. Так что буду очень признателен если кто то поможет.
|
|
| |
beril | Дата: Четверг, 09 Июля 2015, 21:25 | Сообщение # 7105 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата ivan2009 ( ) в третьем player.transform.position += hit.point*speed*Time.deltaTime; - то кубик движется в hit.point пока зажата кнопка ЛКМ, а иногда движется и не туда ну само собой он бужет двигаться пока зажата ЛКМ ты ведь все в Input.GetMouseButton (0) запихнул, а движется не туда потому, что двигаешся в левые координаты, а необходимо сначало найти вектор направления (точка куда нужно двигаться(hit.point) - transform.position) и по нему уже двигаться Для передвижения лучше используй CharacterController
Примерно (нету юнити под рукой) используй что вроде этого Код using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag;
bool walk; public Vector3 TargetToMove = new Vector3();
// Use this for initialization void Start () { player = (GameObject)this.gameObject; //playerPos = player.transform.position;
}
// Update is called once per frame void Update () {
if(walk) move();
mousePos = Input.mousePosition; if (Input.GetMouseButton (0)) { ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ TargetToMove = hit.point; walk = true; } } void move() { var posMove = TargetToMove - transform.position;
controller.SimpleMove(posMove * Time.deltaTime * Speed);
} } }
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
ivan2009 | Дата: Четверг, 09 Июля 2015, 23:14 | Сообщение # 7106 |
частый гость
Сейчас нет на сайте
| Получилось так вот Код using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag; bool walk =true; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { player = (GameObject)this.gameObject;
//playerPos = player.transform.position;
}
// Update is called once per frame void Update () {
if (walk) {
mousePos = Input.mousePosition; if(Input.GetMouseButton(0)){ ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ TargetToMove = hit.point; walk = true;
} } move(); } } void move(){ var posMove = TargetToMove - transform.position; controller.SimpleMove (posMove * Time.deltaTime * speed);
}
} Только вот куб не двигается, переменная TargetToMove отображает координаты, и ругается что вроде как controller постоянно с дэфолтовым значением(null) точно не умерен, в англ слабоват... вот что юнити пишет Assets/MyScript/myMove.cs(14,29): warning CS0649: Field `myMove.controller' is never assigned to, and will always have its default value `null' куда мне контроллер надо подключить?
|
|
| |
Vip_and_Rip | Дата: Четверг, 09 Июля 2015, 23:34 | Сообщение # 7107 |
почетный гость
Сейчас нет на сайте
| Цитата beril ( ) Можно тык Немного не то, но смысл понятен - буду разбираться. Благодарю
Цитата ivan2009 ( ) очу сделать контроллер перемещения объекта с помощью мышки,самый простой, что бы кубик передвигался(пока без анимации ) по платформе по клику ЛКМ в указанное место. Тоже был такой вопрос, но воспользовался кодом из этого урока, потом модифицировал его под свои нужды.
Больше никогда не буду делать игры.
|
|
| |
ivan2009 | Дата: Четверг, 09 Июля 2015, 23:56 | Сообщение # 7108 |
частый гость
Сейчас нет на сайте
| получилось, радостно. на всяк случай скину код может найдутся ещё такие как я... Код using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { // private Vector3 mousePos; //private Vector3 playerPos; public float speed = 5f; Ray ray; RaycastHit hit; GameObject player; float mag; bool walk =true ; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { player = (GameObject)this.gameObject; controller = (CharacterController)gameObject.GetComponent(typeof(CharacterController)); //playerPos = player.transform.position;
}
// Update is called once per frame void Update () {
if (walk) {
//mousePos = Input.mousePosition; if(Input.GetMouseButton(0)){ ray = Camera.main.ScreenPointToRay(Input.mousePosition); if(Physics.Raycast(ray, out hit, 500.0f)){ TargetToMove = hit.point; walk = true;
} } move(); } } void move(){ var posMove = TargetToMove - transform.position; controller.SimpleMove (posMove * Time.deltaTime * speed);
}
} При движении кубик калашматило по всем осям пока в RigidBody freez rotation не поставил. Очень доволен что получилось, сижу гоняю кубик по платформе... Спасибо большое за помощь
Я заметил что по мере приближения объекта к указанной точке он замедляется и чем ближе тем медленней передвигается. Как сделать ему постоянную скорость вне зависимости от оставшегося расстояния?
Сообщение отредактировал ivan2009 - Пятница, 10 Июля 2015, 00:29 |
|
| |
beril | Дата: Пятница, 10 Июля 2015, 06:05 | Сообщение # 7109 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата ivan2009 ( ) Я заметил что по мере приближения объекта к указанной точке он замедляется и чем ближе тем медленней передвигается. Как сделать ему постоянную скорость вне зависимости от оставшегося расстояния? Попробуй вместо SimpleMove => Move
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
JHawk | Дата: Пятница, 10 Июля 2015, 11:29 | Сообщение # 7110 |
めゃくちゃちゃ
Сейчас нет на сайте
| впервые столкнулся с такой проблемой: Код this.transform.rotation.y = gameObject.transform.rotation.y; ругается компилятор, говорит, мол, нельзя так делать. Код error CS1612: Cannot modify a value type return value of `UnityEngine.Transform.rotation'. Consider storing the value in a temporary variable Посоветуйте, как эту проблему решить
|
|
| |
seaman | Дата: Пятница, 10 Июля 2015, 13:15 | Сообщение # 7111 |
старожил
Сейчас нет на сайте
| Цитата JHawk ( ) Посоветуйте, как эту проблему решить Тебе написали как: "Consider storing the value in a temporary variable"
Добавлено (10 июля 2015, 13:15) --------------------------------------------- Цитата ivan2009 ( ) Как сделать ему постоянную скорость вне зависимости от оставшегося расстояния? TargetToMove - transform.position уменьшается при подходе к цели. Следовательно ты все меньше сдвигаешь персонаж. Нужно нормализовать вектор, чтобы избавиться от длины и получить только направление: var posMove = (TargetToMove - transform.position).normalize; Только, естественно скорость подбирать нужно будет (увеличивать).
Сообщение отредактировал seaman - Пятница, 10 Июля 2015, 13:15 |
|
| |
pixeye | Дата: Пятница, 10 Июля 2015, 15:12 | Сообщение # 7112 |
Red Winter Software
Сейчас нет на сайте
| Цитата JHawk ( ) ругается компилятор, говорит, мол, нельзя так делать.
Конечно нельзя. Rotation это структура.
делается так.
this.transform.rotation = Quaternion.Euler(new Vector3 (твое значение , твое значение , твое значение));
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Сообщение отредактировал pixeye - Пятница, 10 Июля 2015, 15:15 |
|
| |
ivan2009 | Дата: Пятница, 10 Июля 2015, 19:20 | Сообщение # 7113 |
частый гость
Сейчас нет на сайте
| Спасибо. У куба при остановке постоянно меняется координата Z (transfotm.position), там тысячные доли циклически(по возрастанию) происходит это быстро(а чем больше я ставлю скорость тем больше это дрожание) и получается что кубик дрожит. И ещё куб постоянно меняет координаты всех осей rotation(вокруг своей оси),я то поставил freezRotation в Rigidbody, но хотелось бы и самому его покрутить... исходник Код using UnityEngine; using System.Collections;
public class myMove : MonoBehaviour { public float speed = 5f; Ray ray; RaycastHit hit; float mag; bool walk = true ; public Vector3 TargetToMove = new Vector3(); CharacterController controller;
// Use this for initialization void Start () { controller = (CharacterController)gameObject.GetComponent<CharacterController>();
} // Update is called once per frame void Update () { if (walk) { if (Input.GetMouseButtonDown (0)) { ray = Camera.main.ScreenPointToRay (Input.mousePosition); if (Physics.Raycast (ray, out hit, 500.0f)) { TargetToMove = hit.point; walk = true; } } move (); } }
void move(){ var posMove = (TargetToMove - transform.position).normalized; controller.SimpleMove (posMove * Time.deltaTime * speed );
} } Буду очень признателен за помощь!
Сообщение отредактировал ivan2009 - Пятница, 10 Июля 2015, 19:22 |
|
| |
seaman | Дата: Пятница, 10 Июля 2015, 19:36 | Сообщение # 7114 |
старожил
Сейчас нет на сайте
| Цитата pixeye ( ) делается так. Quaternion.rot = transform.rotation; rot.y = gameObject.transform.rotation.y; transform.rotation = rot;Добавлено (10 июля 2015, 19:33) ---------------------------------------------
Цитата ivan2009 ( ) кубик дрожит Ну во первых - вынесите проверку луча из if(walk) Во вторых выключайте walk, когда расстояние до цели меньше заданного: Код Vector3 dir = TargetToMove - transform.position; Vector3 dirNormal = dir.normalize; controller.SimpleMove (posMove * Time.deltaTime * speed ); if(dir.magnitude < 0.01f) walk = false; Добавлено (10 июля 2015, 19:36) ---------------------------------------------
Цитата ivan2009 ( ) хотелось бы и самому его покрутить. Как крутить - смотрите мануал: Мануал
|
|
| |
Vip_and_Rip | Дата: Суббота, 11 Июля 2015, 11:11 | Сообщение # 7115 |
почетный гость
Сейчас нет на сайте
| Вот у самого вопрос. Когда пишу какие-то функции, то выходит папирус на десятки строк и с кучей активаторов и переменных. В 3-5 строчек ну никак не удается уложиться. Это нормально, или желательно, по возможности, сокращать длину кода и искать альтернативные варианты?
Больше никогда не буду делать игры.
Сообщение отредактировал Vip_and_Rip - Суббота, 11 Июля 2015, 11:12 |
|
| |
pixeye | Дата: Суббота, 11 Июля 2015, 13:58 | Сообщение # 7116 |
Red Winter Software
Сейчас нет на сайте
| Цитата Vip_and_Rip ( ) Вот у самого вопрос. Когда пишу какие-то функции, то выходит папирус на десятки строк и с кучей активаторов и переменных. В 3-5 строчек ну никак не удается уложиться. Это нормально, или желательно, по возможности, сокращать длину кода и искать альтернативные варианты?
Нужно писать так чтобы было тебе понятно особенно через месяц другой. Ну и это - оптимизированный и хороший код не означает всегда легкочитаемость, но ты точно должен быстро определить откуда растут "ноги".
Юнити предлагает очень удобный "паттерн" - это компоненты. Рассматривай свои объекты как набор компонентов.
Такой вариант позволяет содержать относительно небольшие скрипты, собирать предметы как конструктор и всегда легко определить откуда что вызывается.
ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
|
|
| |
BESS55555 | Дата: Воскресенье, 12 Июля 2015, 17:14 | Сообщение # 7117 |
Three Dollar Bill Y'All$
Сейчас нет на сайте
| Посоветуйте пожалуйста список уроков по unity для древолаза который никогда с ним не сталкивался, мб есть какая то линейка уроков от интерфейса до point and click квеста, желательно чтобы всё в виде текста было. Руки относительно прямые, в своё время изучил графический пакет 3dsmax, photoshop.
|
|
| |
beril | Дата: Воскресенье, 12 Июля 2015, 17:22 | Сообщение # 7118 |
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
| Цитата BESS55555 ( ) желательно чтобы всё в виде текста было. Выбирай любую на русском тоже вроде есть. Ну и мануал самое главное. Там все четко и последовательно и на русском языке
Накодил? Убери за собой! Инвентарь в Unity(UI) Инвентарь в Unity(GUI)
|
|
| |
BESS55555 | Дата: Воскресенье, 12 Июля 2015, 17:30 | Сообщение # 7119 |
Three Dollar Bill Y'All$
Сейчас нет на сайте
| Цитата beril ( ) Выбирай любую на русском тоже вроде есть. Эм, я не нашёл там русских книг) Я англ. не настолько хорошо знаю, чтобы понять все термины которые там наверняка будут. Но всё равно спасибо за оперативность. Просьба до сих пор актуальна.
|
|
| |
GenaMoroz | Дата: Воскресенье, 12 Июля 2015, 17:41 | Сообщение # 7120 |
был не раз
Сейчас нет на сайте
| Доброго времени суток, товарищи. У кого-нибудь есть туторы по вращению 2D объекта с помощью тача?
Level 3
|
|
| |
|