Понедельник, 30 Сентября 2024, 02:30

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-[ответ] по Unity
QWER56Дата: Понедельник, 09 Августа 2010, 10:58 | Сообщение # 1
старожил
Сейчас нет на сайте
Вопрос-[Ответ] по Unity3d

  • База скриптов Unity3d
  • Курс Уроков по Unity 3D от Alcatraz

    ConsMark - поисковик по интернет магазинам.

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • seamanДата: Вторник, 16 Июля 2013, 23:27 | Сообщение # 4281
    старожил
    Сейчас нет на сайте
    Цитата
    как мне сделать чтобы он центр координат отсчитывал не от центра мира,а от камеры?

    Vector3 result = Vector3.исходный - camera.transform.position;
    error111Дата: Среда, 17 Июля 2013, 04:25 | Сообщение # 4282
    заслуженный участник
    Сейчас нет на сайте
    Прошу помощи. Начал ковыряться в Андроиде. Не могу понять как сделать инпут. По тутору из документации пытался сделать создание партикла в точке касания экрана. Тутор на js, я переделывал в c#.
    Код

    using UnityEngine;
    using System.Collections;

    public class InputScript : MonoBehaviour {
          
      public GameObject particle;
      public Vector3 position;
        
      void Update() {
        
             foreach (Touch touch in Input.touches) {
              if (touch.phase == TouchPhase.Began)
        {
         Ray ray = Camera.main.ScreenPointToRay(touch.position);
         position = touch.position;
          
         if( Physics.Raycast(ray))
         {
          Instantiate (particle, transform.position, transform.rotation);
         }
        }
             }
      }
       
      void OnGUI()
      {
       GUI.Label(new Rect(0,0,300,100), "PosX: " + position.x.ToString());
       GUI.Label(new Rect(0,30,300,100), "PosY: " + position.y.ToString());
      }
       
    }


    Тачи приложение видит, коорды выводятся в ГУИ. Но вот партикл не создается. Что не так и что почитать? Юнити 4.1.


    [Shmup/RPG] Fantasy Shmup!
    NEBRДата: Среда, 17 Июля 2013, 08:50 | Сообщение # 4283
    почти ветеран
    Сейчас нет на сайте
    error111, На С# вот так нужно :

    public GameObject particle;
    void Update() {
    int i = 0;
    while (i < Input.touchCount) {
    if (Input.GetTouch(i).phase == TouchPhase.Began) {
    Ray ray = Camera.main.ScreenPointToRay(Input.GetTouch(i).position);
    if (Physics.Raycast(ray))
    Instantiate(particle, transform.position, transform.rotation) as GameObject;
    }
    ++i;
    }
    }


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 08:53
    error111Дата: Среда, 17 Июля 2013, 09:07 | Сообщение # 4284
    заслуженный участник
    Сейчас нет на сайте
    Цитата (NEBR)
    На С# вот так нужно


    Увы, но не работает. Плюс приведение в виде as GameObject так не используется.


    [Shmup/RPG] Fantasy Shmup!


    Сообщение отредактировал error111 - Среда, 17 Июля 2013, 09:10
    NEBRДата: Среда, 17 Июля 2013, 09:11 | Сообщение # 4285
    почти ветеран
    Сейчас нет на сайте
    error111, а если попробовать не GameObject а Transform ?

    King Size #Gamiron12
    error111Дата: Среда, 17 Июля 2013, 09:24 | Сообщение # 4286
    заслуженный участник
    Сейчас нет на сайте
    Цитата (NEBR)
    а если попробовать не GameObject а Transform ?


    Нет, не канает. Ну и плюс в туторе стоит ГО - значит можно и через него сделать.
    У меня еще один косяк - не могу Ремоут настроить, приходится для теста каждый раз компилировать и закидывать на девайс((
    Сейчас параллельно с тачем поставил инстаншиейт на инпут с клавы. Патиклы создаются, но только на МейнКамере. Это вполне логично - скрипт висит на ней. Судя по всему и в Андроид-версии патиклы спаунятся там-же и их просто не видно. Но чем задать им правильный трансформ?..не догоняю..


    [Shmup/RPG] Fantasy Shmup!
    Fr0sTДата: Среда, 17 Июля 2013, 09:27 | Сообщение # 4287
    постоянный участник
    Сейчас нет на сайте
    seaman, тоесть поворот будет тоже с учетом поворота камеры?



    NEBRДата: Среда, 17 Июля 2013, 10:36 | Сообщение # 4288
    почти ветеран
    Сейчас нет на сайте
    error111, щас быстренько соберу такую же сценку и через ремоут запущу, проверим )

    Добавлено (17.07.2013, 10:06)
    ---------------------------------------------
    error111, скрипт правильный, все работает. Три нюанса : 1 - партиклы создаются при прикосновении к объекту с коллайдером. (на сцену нужно добавить хоть кубик, и нажимать на него) 2 - скрипт вешать нужно не на камеру, а на другой объект, который будет в поле зрения камеры. 3 - координаты созданных партиклов нужно приравнять к координатам нажатия. Сейчас набросаю рабочий скрипт и пришлю

    Добавлено (17.07.2013, 10:14)
    ---------------------------------------------
    error111, кстати, твой скрипт рабочий, просто партиклы создаются не в поле видимости камеры (рабочий, опять же, если нажимать на объект с коллайдером)

    ---------------------------------------------


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 11:22
    error111Дата: Среда, 17 Июля 2013, 10:36 | Сообщение # 4289
    заслуженный участник
    Сейчас нет на сайте
    Цитата (NEBR)
    кстати, твой скрипт рабочий, просто партиклы создаются не в поле видимости камеры


    Ну это я уже более-менее понял. Создавать патиклы при Рэйхите у меня получалось. Вся загвоздка в создании ГО без хита по другому объекту. Ведь как-то же это возможно..


    [Shmup/RPG] Fantasy Shmup!
    NEBRДата: Среда, 17 Июля 2013, 10:51 | Сообщение # 4290
    почти ветеран
    Сейчас нет на сайте
    error111, без хита по другому объекту это делается так:
    int i = 0;
    while (i < Input.touchCount) {
    if (Input.GetTouch(i).phase == TouchPhase.Began)
    Instantiate(prefab, transform.position, transform.rotation) as GameObject;
    ++i;
    }


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 10:56
    E][pertДата: Среда, 17 Июля 2013, 11:04 | Сообщение # 4291
    C#-XNA-Unity
    Сейчас нет на сайте
    Цитата (E||pert)
    У меня такой вопрос, в какую сторону мне копать для отслеживания какое именно действие игрок сделал на таче. Например провел ли он снизу вверх пальцем прямую(возможны небольшие отклонения) или кривую.


    Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
    Tower defence in processing... For Web/iOS/Android.
    NEBRДата: Среда, 17 Июля 2013, 11:20 | Сообщение # 4292
    почти ветеран
    Сейчас нет на сайте
    E][pert, написать свой скрипт с использованием TouchPhase.Moved. Тут самое сложное - в апдейте просчитывать положение transform.position пальца на экране и (если проверяем прямая ли линия, проведенная снизу вверх) если разница между значениями по Y (здесь поможет Mathf.Clamp) больше определенного значения (диапазон самому нужно рассчитать) - то линия кривая. Если разница меньше нашего значения - то относительно прямая

    King Size #Gamiron12

    Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 11:24
    error111Дата: Среда, 17 Июля 2013, 11:23 | Сообщение # 4293
    заслуженный участник
    Сейчас нет на сайте
    Цитата (NEBR)
    без хита по другому объекту это делается так


    Работает, но ГО создается в координатах префаба. А как инстансить в точке нажатия?.


    [Shmup/RPG] Fantasy Shmup!
    NEBRДата: Среда, 17 Июля 2013, 11:32 | Сообщение # 4294
    почти ветеран
    Сейчас нет на сайте
    error111, я сейчас работаю над этим. Ввел опять же твой вектор position и играю с ним. Видимо, придется самому делать калибровку экрана в этой сцене. Сделал камеру оргографической, по Z -10. Посмотрел диапазон зоны видимости, она составила (x(-66,66)y(-160,160)). Соответственно если партиклы попадают в этот диапазон , они видны. Сейчас нужно рассчитать коэффициент, и при создании частиц умножать позиции на него

    King Size #Gamiron12
    error111Дата: Среда, 17 Июля 2013, 11:54 | Сообщение # 4295
    заслуженный участник
    Сейчас нет на сайте
    Цитата (NEBR)
    Сделал камеру оргографической, по Z -10. Посмотрел диапазон зоны видимости, она составила (x(-66,66)y(-160,160)). Соответственно если партиклы попадают в этот диапазон , они видны. Сейчас нужно рассчитать коэффициент, и при создании частиц умножать позиции на него


    Ну так на сколько я понимаю если мы у камеры изменим размер проекции, то все эти коэффициенты полетят к чертям или нет?.Мне кажется должен быть более эргономичный способ.


    [Shmup/RPG] Fantasy Shmup!
    NEBRДата: Среда, 17 Июля 2013, 11:59 | Сообщение # 4296
    почти ветеран
    Сейчас нет на сайте
    error111, верно, все полетит к чертям ) Способ должен быть. Вот думаю может все из за локальных/глобальных координат... Переключал их, не помогло...

    King Size #Gamiron12
    E][pertДата: Среда, 17 Июля 2013, 12:14 | Сообщение # 4297
    C#-XNA-Unity
    Сейчас нет на сайте
    NEBR, спасибо, но это как бы очевидно) Я уже начал реализовывать на этой основе. Тут у меня еще такой вопрос, как оптимальней записывать в массив позицию?

    Помогаю по мере возможностей, учусь по мере сил. ©E}{pert
    Tower defence in processing... For Web/iOS/Android.


    Сообщение отредактировал E][pert - Среда, 17 Июля 2013, 12:14
    NEBRДата: Среда, 17 Июля 2013, 17:16 | Сообщение # 4298
    почти ветеран
    Сейчас нет на сайте
    error111, может проблема в единицах измерения? Размер экрана 320 на 480 в пикселях, и координаты соответственно в них. А transform.position партиклов - в юнит, равном 1 метру...

    Добавлено (17.07.2013, 13:11)
    ---------------------------------------------
    Да, проблема именно в них. Настроил камеру так чтобы 1 пиксель соответствовал стандартной еденице измерения юнити unit, равной 1 метру. Дописываю скрипт, половина его уже готова, работает корректно. Как закончу - выложу

    Добавлено (17.07.2013, 13:48)
    ---------------------------------------------
    error111, Проблема решена. Подойдет только для разрешения 320 на 480, но по аналогии можно под любое сделать. Вообщем сперва на пустой сцене (без камеры) создаем куб. На него вешаем ortho2dCamera . Этот скрипт создаст на кубе камеру и автоматически выставит в ее настройках нужные значения, чтобы экран был пиксель в юнит.
    using UnityEngine;
    [ExecuteInEditMode]
    [RequireComponent(typeof(Camera))]
    internal class ortho2dCamera : MonoBehaviour
    {
    [SerializeField] private bool uniform = true;
    [SerializeField] private bool autoSetUniform = false;
    private void Awake()
    {
    camera.orthographic = true;
    if (uniform)
    SetUniform();
    }
    private void LateUpdate()
    {
    if (autoSetUniform && uniform)
    SetUniform();
    }
    private void SetUniform()
    {
    float orthographicSize = camera.pixelHeight/2;
    if (orthographicSize != camera.orthographicSize)
    camera.orthographicSize = orthographicSize;
    }
    }
    Затем на этот же куб вешаем скрипт touchParticle
    using UnityEngine;
    using System.Collections;
    public class touchParticle : MonoBehaviour {
    public GameObject particle;
    public Vector3 position;
    public Vector3 positionTouch;
    void Update() {
    int i = 0;
    foreach (Touch touch in Input.touches) {
    if (Input.GetTouch(i).phase == TouchPhase.Began) {
    position = touch.position;
    if(position.x < 160) {
    positionTouch.x = (-(160 - position.x)-10); // последнее значение 10 возможно вам не понадобится, скорее всего мне пришлось его ввести из за плохой калибровки экрана // на своем девайсе
    }
    else {
    positionTouch.x = (160 - (320 - position.x) + 10);
    }
    if(position.y < 240) {
    positionTouch.y = (-(240 - position.y)-10);
    }
    else {
    positionTouch.y = (240 - (480 - position.y) + 10);
    }
    Instantiate(particle,positionTouch,transform.rotation);
    ++i;
    }
    }
    }
    void OnGUI()
    {
    GUI.Label(new Rect(0,0,300,100), "PosX: " + position.x.ToString());
    GUI.Label(new Rect(0,30,300,100), "PosY: " + position.y.ToString());
    }
    }
    Затем создаем префаб партиклов и линкуем его со скриптом. Все, отлично работает

    Добавлено (17.07.2013, 17:16)
    ---------------------------------------------
    E][pert, как записывать в массив позицию
    http://unity3d.ru/distribution/viewtopic.php?f=104&t=8418&p=65539&hilit=%D0%BA%D0%B0%D0%BA+%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B8%D1%82%D1%8C+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2+%D1%81+%D0%BA%D0%BE%D0%BE%D1% 80%D0%B4%D0%B8%D0%BD%D0%B0%D1%82%D0%B0%D0%BC%D0%B8#p65539


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Среда, 17 Июля 2013, 13:52
    OmletteДата: Среда, 17 Июля 2013, 22:43 | Сообщение # 4299
    частый гость
    Сейчас нет на сайте
    Всем здрасьте! А у меня такая проблема...

    В общем нужно сделать, чтоб при нажатии на ГО с некоторым тегом появлялся бар. Это все легко. Проблем не было, когда я все писал в одном скрипте:

    Код
    using UnityEngine;
    using System.Collections;

    public class monster_bar : MonoBehaviour {
         
       public readonly int lv = monster_stats.monster_level;
       public readonly int hp = monster_stats.monster_hp;
       public int cur_hp = monster_stats.monster_cur_hp;
       public Texture2D monster_img;
            
          public  bool Show_bar = false;
       public  string Target_name;
         
       public GUISkin skin;
       //strings
       public string mclass;
       public string class_title;
         
       //sound
       public AudioClip Click_mob;
          
       // Use this for initialization
       void Start ()   
       {
        cur_hp = hp;
       }
         
         
       // Update is called once per frame
          void Update()
       {
          
       if (Input.GetMouseButtonUp(0))
              {
                  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);              
                  RaycastHit hit;                     
            
                  if (Physics.Raycast(ray, out hit, 65))                     
                  {
             Debug.DrawLine(ray.origin, hit.point);                     
                    
          
            if(hit.collider.gameObject.tag == "monster")                         
         {          
             Show_bar = true;
          target_name = hit.collider.gameObject.name;
             audio.PlayOneShot(Click_mob);
         }    
            else   
            {
                Show_bar = false;
          target_name = null;
            }
        }
        }
            if (Input.GetKeyDown(KeyCode.Escape))
          {
           Show_bar = false;
                 target_name = null;
          }
       }
         
       void OnGUI()
       {
          
        GUI.skin = skin;
          
        if (ShowBar == true)
        {     
         GUI.Box(new Rect(0.5f * Screen.width, 0.048f * Screen.height, Screen.width * 0.109f, Screen.height * 0.08f), Target_name, GUI.skin.GetStyle("monster_bar"));
         GUI.Label(new Rect(0.503f * Screen.width, 0.077f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), "Health: " + hp + " / " + cur_hp, GUI.skin.GetStyle("hp_ch_status"));
         GUI.Label(new Rect(0.503f * Screen.width, 0.103f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), class_title + ": " + mclass, GUI.skin.GetStyle("hp_ch_status"));
        }
       }
    }


    Однако мне нужно, чтобы все это лежало во втором скрипте, а этот только отображал на экран.

    Пытаюсь так:

    1. Основной скрипт monster_targetting:

    Код
    using UnityEngine;
    using System.Collections;

    public class monster_targetting : MonoBehaviour {
         
          static private bool _Show_bar = false;
       static private string _target_name;
         
       static public bool Show_bar
       {
        get
        {
         return _Show_bar;
        }
          
        set
        {
         _Show_bar = value;
        }
       }
         
        static public string  target_name
       {
        get
        {
         return _target_name;
        }
          
        set
        {
         _target_name = value;
        }
       }
         
       //sounds
       static readonly AudioClip Click_mob;
         
       // Use this for initialization
       void Start () {
         
       }
         
       // Update is called once per frame
          void Update()
       {
          
       if (Input.GetMouseButtonUp(0))
              {
                  Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);            //получим координаты мышки
                  RaycastHit hit;                    //Объявим структуру, из которой будем брать данные
            
                  if (Physics.Raycast(ray, out hit, 65))                    //возвращает true если сталкивается с чем либо
                  {
             Debug.DrawLine(ray.origin, hit.point);                             //покажем линией на выделяемый объект.
                    
          
            if(hit.collider.gameObject.tag == "monster")                        // Разрешаем помечать объекты только с этим тегом
         {          
             Show_bar = true;
          target_name = hit.collider.gameObject.name;
             audio.PlayOneShot(Click_mob);
         }    
            else   
            {
                Show_bar = false;
          target_name = null;
            }
        }
        }
            if (Input.GetKeyDown(KeyCode.Escape))
          {
           Show_bar = false;
                 target_name = null;
          }
       }
    }


    2. Ну и второй, получающий переменные и выводящий на экран панель:

    Код
    using UnityEngine;
    using System.Collections;

    public class monster_bar : MonoBehaviour {
         
       public readonly int lv = monster_stats.monster_level;
       public readonly int hp = monster_stats.monster_hp;
       public int cur_hp = monster_stats.monster_cur_hp;
       public Texture2D monster_img;
            
       public string Target_name = monster_targetting.target_name;
          public bool ShowBar = monster_targetting.Show_bar;
         
       public GUISkin skin;
       //strings
       public string mclass;
       public string class_title;
         
       //sound
       public AudioClip Click_mob;
          
       // Use this for initialization
       void Start ()   
       {
        cur_hp = hp;
       }
         
         
       // Update is called once per frame
          void Update ()
       {
          
       }
         
       void OnGUI()
       {
          
        GUI.skin = skin;
          
        if (ShowBar == true)
        {     
         GUI.Box(new Rect(0.5f * Screen.width, 0.048f * Screen.height, Screen.width * 0.109f, Screen.height * 0.08f), Target_name, GUI.skin.GetStyle("monster_bar"));
         GUI.Label(new Rect(0.503f * Screen.width, 0.077f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), "Health: " + hp + " / " + cur_hp, GUI.skin.GetStyle("hp_ch_status"));
         GUI.Label(new Rect(0.503f * Screen.width, 0.103f * Screen.height, Screen.width * 0.01f, Screen.height * 0.01f), class_title + ": " + mclass, GUI.skin.GetStyle("hp_ch_status"));
        }
       }
    }


    Очень много чего испробовал, ничего не вышло. Отображающий скрипт не ловит значения переменных (свойств)....

    П.С. Сорри если есть где копи-паст ошибка в скриптах. Заранее благодарю откликнувшимся!


    Я все смогу! Я все сумею! Переживу! Переболею! Перекантуюсь! Перебьюсь! Но своего таки добьюсь! Не упаду! Не утону! Из грязи вырвусь! Я смогу! И вновь улыбка засияет! Я все смогу! Я все сумею! Я не боюсь! Я не жалею!

    Сообщение отредактировал Omlette - Среда, 17 Июля 2013, 22:44
    NEBRДата: Четверг, 18 Июля 2013, 11:41 | Сообщение # 4300
    почти ветеран
    Сейчас нет на сайте
    Omlette, попробуй другим способом. Здесь ведь можно сделать проще, не через get set, а использовать GetComponent.

    King Size #Gamiron12
    Поиск:

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