Пятница, 22 Ноября 2024, 21:23

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-[ответ] по 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 пока зажата кнопка ЛКМ, а иногда движется и не туда smile
    А мне бы хотелось сделать так что при нажатии ЛКМ(одном клике) кубик с определенной скоростью передвигался в точку 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 ()
    Можно тык

    Немного не то, но смысл понятен - буду разбираться. Благодарю smile

    Цитата 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 не поставил.
    Очень доволен что получилось, сижу гоняю кубик по платформе... smile
    Спасибо большое за помощь

    Я заметил что по мере приближения объекта к указанной точке он замедляется и чем ближе тем медленней передвигается. Как сделать ему постоянную скорость вне зависимости от оставшегося расстояния?


    Сообщение отредактировал 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
    Поиск:

    Все права сохранены. GcUp.ru © 2008-2024 Рейтинг