Пятница, 27 Декабря 2024, 22:41

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

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

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

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

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • EchoITДата: Среда, 02 Июля 2014, 20:16 | Сообщение # 6201
    старожил
    Сейчас нет на сайте
    Adom, ты сначала пойми, что это такое, а потом у тебя отпадут вопросы вроде того, что ты задал сейчас.

    Долгожданный анонсик: State of War
    AdomДата: Среда, 02 Июля 2014, 20:33 | Сообщение # 6202
    Печенька!
    Сейчас нет на сайте
    EchoIT, Единственное что я знаю (может и не правильно.) Это то что RPC это функция которая посылает сообщения всем объектам.
    allodsДата: Среда, 02 Июля 2014, 21:47 | Сообщение # 6203
    почти ветеран
    Сейчас нет на сайте
    Насколько я знаю это не функция , RPC просто ставится перед функцией и отсылает данные всем игрокам, или выбранным то что произошло в этой функции. По крайней мере мне так помнится
    AdomДата: Среда, 02 Июля 2014, 22:47 | Сообщение # 6204
    Печенька!
    Сейчас нет на сайте
    Извините что я такой тупой но не могли бы вы показать на примере и расписать ?
    Код
    /*Created By Adom*/
    using UnityEngine;
    using System.Collections;

    public class HealthBox : MonoBehaviour {
    public float CurHealth=100;
    public float MaxHealth=100;
    public bool Damage;
    // Use this for initialization
    public void Start () {
       
    }  
    // Update is called once per frame
    public void Update () {  
    if(networkView.isMine){
    if (CurHealth <= 0) {   
    StartCoroutine(Dead());      
    }
    }
    }
    void OnTriggerEnter(){
    if(GameObject.FindWithTag("Bullet")){
    DamagePlayer();
    }
    }
    [RPC]
    public void DamagePlayer(){  
    if(CurHealth>0){  
    CurHealth-=Random.Range(15,20);
    }
    }
    public void OnGUI(){  
    if(networkView.isMine){
    GUI.Label(new Rect(100,700,150,50),CurHealth+"/"+MaxHealth);
    GUI.Box(new Rect(100,700,100,20),"");   
    }
    }
    IEnumerator Dead(){
    yield return new WaitForSeconds(0.1f); // продолжить примерно через 100ms
    Network.Destroy (gameObject);
    GameObject.FindWithTag ("Server").GetComponent<SpawnScript> ().NewPlayer ();
    }
    }
    allodsДата: Четверг, 03 Июля 2014, 00:48 | Сообщение # 6205
    почти ветеран
    Сейчас нет на сайте
    я не знаю как там в unitynetwork а в фотоне так

    Код
    [RPC]
       public void takeDMG(float amt)
       {
        hp -= amt;
        if(hp<=0)
        {
         Die();
        }
       }


    Код
    h.GetComponent<PhotonView>().RPC("takeDMG",PhotonTargets.All, dmg);
    "h" обжект у которого надо отнять хп

    Примерно так наверное и у юнити сервера , сказать не могу

    Добавлено (03.07.2014, 00:12)
    ---------------------------------------------
    Кто может сказать, как через скрипт узнать какая анимация проигрывается в macanim. В legacy просто через animation а в меканим?

    Добавлено (03.07.2014, 00:48)
    ---------------------------------------------
    animator.GetCurrentAnimatorStateInfo(int layer)


    Сообщение отредактировал allods - Четверг, 03 Июля 2014, 00:49
    lentinantДата: Четверг, 03 Июля 2014, 04:04 | Сообщение # 6206
    ленивый программист
    Сейчас нет на сайте
    Цитата WPhoeniXW ()
    Да ну не может быть... Мне, кажется, ты что-то путаешь. Я думаю это из-за компиляции под Андроид. Если скомпилировать под Web, всё приложение весит 789 КБ

    Я тебе вот такую аналогию проведу. Есть игровой автомат. Он автономно воспроизводит одну игру, но имеет большой размер. И есть компакт-диск с игрой и компьютер, который эту игру производит. Сам по себе компакт-диск маленький, но без компа он ничего не стоит. По аналогии с юнити - автономная игра вмещает в себя движок, поэтому весит так много. web-версия же просто является набором ресурсов, сам движок находится у тебя на компе в виде плагина Unity Web Player.


    Когда-то тут будут ссылки на крутые проекты. Или нет.
    lakorisДата: Четверг, 03 Июля 2014, 05:36 | Сообщение # 6207
    постоянный участник
    Сейчас нет на сайте
    lentinant, все правильно smile
    iOneДата: Четверг, 03 Июля 2014, 10:13 | Сообщение # 6208
    был не раз
    Сейчас нет на сайте
    Помогите разобраться где ошибка.

    Есть скрипт на объекте, в нём переменная:

    Код
    //Радиус объекта, ближе нельзя приближаться
      public float Radius = 15f;

    Пытаюсь получить переменную из другого скрипта:

    Код
    if (Input.GetMouseButton(0))
                 {
                      ray = UnityEngine.Camera.mainCamera.ScreenPointToRay(Input.mousePosition);
                      if (Physics.Raycast(ray, out hit, 10000.0f))
                      {
         target = hit.transform.position; //point;
         heightPlayer = hit.collider.transform.GetComponents<PlanetInfo>().Radius;
         }
        }

    Переменная heightPlayer тоже float и сейчас задана жестко. Если убрать строчку:
    Код
    heightPlayer = hit.collider.transform.GetComponents<PlanetInfo>().Radius;

    Всё работает.
    При запуске выдаёт ошибку:
    Код
    Assets/Scripts/MovePlayer.cs(46,99): error CS1061: Type `PlanetInfo[]' does not contain a definition for `Radius' and no extension method `Radius' of type `PlanetInfo[]' could be found (are you missing a using directive or an assembly reference?)
    AdomДата: Четверг, 03 Июля 2014, 10:48 | Сообщение # 6209
    Печенька!
    Сейчас нет на сайте
    allods, В Unity наверное почти так-же сейчас попробую )
    xMoonGuarDxДата: Четверг, 03 Июля 2014, 10:55 | Сообщение # 6210
    участник
    Сейчас нет на сайте
    iOne, посмотри, что бы твоя переменная Radius была в классе PlanetInfo (если это класс, а не интерфейс или enum), так же проверь область видимости, т.е. что твой скрипт знает о существовании этого класса.
    iOneДата: Четверг, 03 Июля 2014, 11:31 | Сообщение # 6211
    был не раз
    Сейчас нет на сайте
    Код
    public class PlanetInfo : MonoBehaviour {

       //Радиус объекта, ближе нельзя приближаться
       public float Radius = 50f;
    }


    Цитата xMoonGuarDx ()
    так же проверь область видимости, т.е. что твой скрипт знает о существовании этого класса.

    Можно подробнее, не совсем понял как это сделать.

    Ещё один вопрос: как определить радиус коллаидра выбранного объекта?


    Сообщение отредактировал iOne - Четверг, 03 Июля 2014, 11:33
    NEBRДата: Четверг, 03 Июля 2014, 12:33 | Сообщение # 6212
    почти ветеран
    Сейчас нет на сайте
    Цитата iOne ()
    как определить радиус коллаидра выбранного объекта?


    Вот, например, коллайдер стандартного куба. Эту величину можно изменять



    А из скрипта обратится к ней можно так
    Код


    public BoxCollider boxCollider;

    void Start()
    {
    Debug.Log(boxCollider.size.x);
    }


    Если объект не куб, а любой другой - делается аналогично, только вместо size будет radius


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Четверг, 03 Июля 2014, 12:35
    AdomДата: Четверг, 03 Июля 2014, 12:38 | Сообщение # 6213
    Печенька!
    Сейчас нет на сайте
    allods, Спасибо твой вариант помог ).
    И все-таки задам старый вопрос.
    Как сделать скачивание целой папки ? т.е что-бы при нажатии кнопки скачивалась папка и был выбор пути куда ее кидать ?


    Сообщение отредактировал Adom - Четверг, 03 Июля 2014, 12:38
    lentinantДата: Четверг, 03 Июля 2014, 12:55 | Сообщение # 6214
    ленивый программист
    Сейчас нет на сайте
    iOne, ты используешь GetComponents - этот метод возвращает МАССИВ. В ошибке четко сказано - ты получаешь не один компонент, а массив, и пытаешься получить с этого массива значение, как с одного компонента. Замени GetComponents на GetComponent.

    Когда-то тут будут ссылки на крутые проекты. Или нет.
    iOneДата: Четверг, 03 Июля 2014, 13:37 | Сообщение # 6215
    был не раз
    Сейчас нет на сайте
    Цитата NEBR ()
    А из скрипта обратится к ней можно так
    Если объект не куб, а любой другой - делается аналогично, только вместо size будет radius

    Спасибо, пригодится.

    Цитата lentinant ()
    iOne, ты используешь GetComponents - этот метод возвращает МАССИВ. В ошибке четко сказано - ты получаешь не один компонент, а массив, и пытаешься получить с этого массива значение, как с одного компонента. Замени GetComponents на GetComponent.

    Огромное спасибо. Не понял что он про массив ругается. Теперь всё работает.

    Ну и крайний вопрос на сегодня: При выполнении команды
    Код
    Debug.Log("Радиус планеты " + heightPlayer);

    Русские символы отображаются не корректно, понятно что кодировка не та, но где её поменять?


    Сообщение отредактировал iOne - Четверг, 03 Июля 2014, 13:41
    allodsДата: Четверг, 03 Июля 2014, 14:18 | Сообщение # 6216
    почти ветеран
    Сейчас нет на сайте
    Кто может помочь, При входе в триггер я изменяю некоторые переменные у обжекта который входит. Мне нужно изменить только раз, потом чтоб на него этот триггер больше не действовал.

    Для этого я создал массив . Идея, заполнять массив теми обжектами, которые входят в триггер . Потом проверять обжект который входит в триггер, если он есть в массиве, то ничего не делать.

    Нужно занести этот обжект только раз а массив, если его там еще нет. Вроде все просто, при входе в триггер проверять есть обжект или нет, но я не догоняю как ?

    if(players[i]!=other.collider.gameObjecl) заполняет с каждым входом в триггер новый массив который не являются other.collider.gameObjecl.
    Как проверять правильно кто может сказать ?
    NEBRДата: Четверг, 03 Июля 2014, 15:32 | Сообщение # 6217
    почти ветеран
    Сейчас нет на сайте
    allods, попробуй стринговыми переменными. Велосипед, конечно, но, думаю, работать будет.
    Или по именам, например

    if(players[i].name != other.collider.gameObject.name)
    {
    //добавляем объект в массив
    }


    King Size #Gamiron12
    allodsДата: Четверг, 03 Июля 2014, 16:21 | Сообщение # 6218
    почти ветеран
    Сейчас нет на сайте
    если массив пустой то ругается что нету объекта , то есть ничего не работает. А если сравнивать только с не пустыми массивами то тоже не работает так как они еще пустые, кольцо получается

    Добавлено (03.07.2014, 16:08)
    ---------------------------------------------
    если заполнить массивы другими объектами (любыми) то все массивы заполняются объектом который зашел в триггер, поскольку имя его не равняется именам других

    Добавлено (03.07.2014, 16:21)
    ---------------------------------------------
    В общем что я хочу сделать .

    Персонаж делает широкий удар мечом, при срабатывании триггера меча с игроком отнимает у них ХП. Дело в том что иногда игрок может войти несколько раз в триггер меча, а отнять ХП нужно только один раз за удар, не важно сколько раз сработал триггер .

    На мече висит триггер и скрипт, при входе в триггер проверяется игрок ли это. Если игрок то отнимаем ХП.

    Удар широкий и наносит урон всем игрокам до кого прикоснется, если игрок перемещается то возможно что меч коснется 2 или более раз одного и того же игрока(это мне надо избежать).

    Получается , я делаю массив куда заношу игроков в которых попал меч, и проверяю является ли игрок одним из тех в кого он попал. Если еще не попадал то отнимаем ХП. После завершения удара я отчищаю все массивы .

    lentinantДата: Четверг, 03 Июля 2014, 16:28 | Сообщение # 6219
    ленивый программист
    Сейчас нет на сайте
    allods, пользуйся списками (List). Проверка, есть ли элемент в списке, проводится методом Contains, который возвращает соответственное логическое значение.

    Добавлено (03.07.2014, 16:28)
    ---------------------------------------------

    Цитата allods ()
    если массив пустой то ругается что нету объекта , то есть ничего не работает. А если сравнивать только с не пустыми массивами то тоже не работает так как они еще пустые, кольцо получается

    Какая-то высосанная с пальца проблема. Массив пустой? Значит, там точно нет твоего объекта (ваш кеп), и ты можешь смело добавлять его в массив.


    Когда-то тут будут ссылки на крутые проекты. Или нет.
    allodsДата: Четверг, 03 Июля 2014, 16:31 | Сообщение # 6220
    почти ветеран
    Сейчас нет на сайте
    lentinant, ты про Array?

    Добавлено (03.07.2014, 16:31)
    ---------------------------------------------

    Цитата allods ()
    Какая-то высосанная с пальца проблема. Массив пустой? Значит, там точно нет твоего объекта (ваш кеп), и ты можешь смело добавлять его в массив.

    Я сказал что заполняет весь массив сразу , а потом и эти все уже заполняются другим объектом
    Поиск:

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