Суббота, 21 Сентября 2024, 08:50

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

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

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

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

    Сообщение отредактировал QWER56 - Вторник, 26 Июля 2011, 20:54
  • LabirintikДата: Среда, 11 Декабря 2013, 19:03 | Сообщение # 5121
    постоянный участник
    Сейчас нет на сайте
    Цитата allods ()
    Без сида они меняются , но проблема в том что они могут быть одинаковые. Под одинаковыми я имею в виду то что рандом1 = рандом2 или с рандом3 а мне нужно обязательно разное значение

    Может проверять если i = i-1,
    то опять ставить рандом число.
    AdomДата: Среда, 11 Декабря 2013, 19:05 | Сообщение # 5122
    Печенька!
    Сейчас нет на сайте
    Блин протупил =(. Теперь все.
    allodsДата: Среда, 11 Декабря 2013, 20:23 | Сообщение # 5123
    почти ветеран
    Сейчас нет на сайте
    Цитата NEBR ()
    но думаю, это не лучший способ.

    решил таким способом, кидать в update

    Код

    Random.seed = Random.Range(42,9000);
        for (var i = 0; i < cM; i++)   
        {
         for (var i2 = 0; i2 < cM; i2++)   
         {
          if(charRand[i]==charRand[i2] && i!=i2)
          {
           charRand[i] = Random.Range(0,8);
          }
         }
                      }

    будет рандомить пока не будут все разные


    Сообщение отредактировал allods - Среда, 11 Декабря 2013, 20:24
    lentinantДата: Среда, 11 Декабря 2013, 23:13 | Сообщение # 5124
    ленивый программист
    Сейчас нет на сайте
    Есть такая штука, как списки. То же, что и массивы, только позволяет удобно удалять, добавлять и искать элементы. Можно банально сделать список с 9 элементов, с значениями от 0 до 8, брать индекс Random.Range(0, list.Count) (от 0 до последнего элемента списка), брать соответственный элемент списка в массив charRand, а из листа удалять. Таким образом, если мы получаем по запросу от 0 до 8 рандомное число 3, то у нас элемент списка с числом 2. Следующий рандом индекса будет от 0 до 7, и полученный элемент списка точно не будет 2.

    Когда-то тут будут ссылки на крутые проекты. Или нет.
    allodsДата: Среда, 11 Декабря 2013, 23:28 | Сообщение # 5125
    почти ветеран
    Сейчас нет на сайте
    Не совсем так, рандом от 0 до 8, выпал4. Потом ты как будешь делать рандом? от 0 до 4 и от 5 до 8? я не догоняю
    lentinantДата: Четверг, 12 Декабря 2013, 00:33 | Сообщение # 5126
    ленивый программист
    Сейчас нет на сайте
    Цитата allods ()
    Не совсем так, рандом от 0 до 8, выпал4. Потом ты как будешь делать рандом? от 0 до 4 и от 5 до 8? я не догоняю

    Да нет же. Мы берем случайный элемент списка. В списке каждый элемент - число от 0 до 8 (то есть, первый элемент - 0, второй - 1, третий - 2, и т.д.). С помощью Random.Range(0, list.Count) мы генерируем число, которое будет служить индексом для выбора элемента списка. Не самого числа, а именно элемента списка. В начале оно у нас может быть от 0 до 8. Припустим, выпало число 1, значит, мы берем второй элемент списка, число 1. После чего этот элемент удаляем. Длина списка становится меньше на единицу, а сам список теперь имеет вид 0, 2, 3, 4... Теперь мы получаем индекс от 0 до 7. И если нам опять попадет 1, то этот индекс будет отвечать уже элементу списка, содержащему 2, так как элемент списка, содержащий 1, мы уже удалили. И т.д..

    Добавлено (12.12.2013, 00:33)
    ---------------------------------------------
    Грубо говоря, это если у тебя числа были написаны на бумажках, а бумажки были в какой-то вазочке. Ты вытаскиваешь из вазы случайную бумажку, и следующий раз, ты уже не можешь ее вытащить, так как ее там уже нет.


    Когда-то тут будут ссылки на крутые проекты. Или нет.
    allodsДата: Четверг, 12 Декабря 2013, 07:25 | Сообщение # 5127
    почти ветеран
    Сейчас нет на сайте
    Идея очень хорошая, я сперва не так понял, но есть но cry
    Все 4 или более рандомов рандомятся одновременно , получится что если 3 или более рандомнят на скажем 2 в один момент, то все 3 так и останутся с 2, все ровно придется перепроверять


    Сообщение отредактировал allods - Четверг, 12 Декабря 2013, 12:58
    AdomДата: Четверг, 12 Декабря 2013, 14:53 | Сообщение # 5128
    Печенька!
    Сейчас нет на сайте
    Эмм поможете написать нормальный контроллер ? Я сделал но коряво.
    Вот мое детище !
    Код
    using UnityEngine;  
    using System.Collections;  

    public class ControllerD2 : MonoBehaviour {  
    public Transform Player;  
    public float Speed = 1.0f;  
    public MouseLook cam;  
    public Camera cam2;  
    public float Gravity;  
    private float timeout;  
    public float footstepTime = 0.7f;  
    public AudioClip step;   
    public AudioClip step2;  
    public AudioClip step3;   
    public AudioClip step4;    
    public float a = 100;  
    public float b = 20;   
    public Transform cube;  
    private RaycastHit Hit;  
    public AudioClip cel;
    // Use this for initialization  
    void Start () {   
    }  
    void Update(){  
    Vector3 Direction = Player.TransformDirection(Vector3.down);  
    if(Physics.Raycast(Player.position, Direction, out Hit,10000f)){      
    }       
    timeout += Time.deltaTime;    
    if(Input.GetKeyDown(KeyCode.Mouse1)){  
    cam.sensitivityX = 2;  
    cam.sensitivityY = 2;  
    cam2.fieldOfView = 25;
    audio.PlayOneShot(cel);
    }else{  
    if(Input.GetKeyUp(KeyCode.Mouse1)){  
    audio.PlayOneShot(cel);     
    cam2.fieldOfView = 65;      
    cam.sensitivityX = 10;  
    cam.sensitivityY = 10;     
    }  
    }    
    {  
    if(Input.GetKey(KeyCode.W)){    
    transform.position += transform.forward * 0.7f;
    }
    if(Input.GetKey(KeyCode.S)){    
    transform.position -= transform.forward * 0.7f;      
    }
    if(Input.GetKey(KeyCode.D)){    
    transform.position += transform.right * 0.7f;      
    }
    if(Input.GetKey(KeyCode.A)){    
    transform.position -= transform.right * 0.7f;      
    }    
    if(Input.GetKey(KeyCode.Space)){    
    Gravity +=0.1f;  
    transform.position += transform.up * Speed;  
    }  
    if(Input.GetKey(KeyCode.LeftShift)){    
    transform.position += transform.forward * 2;  
    }  
    }  
    }  
    // Update is called once per frame  
    void FixedUpdate () {  
    transform.position -= transform.up * Time.deltaTime;   
    if(Input.GetKey(KeyCode.W)&timeout>=Speed && Hit.collider.name == "Dirt"){//это  
    timeout = 0;  
    audio.PlayOneShot(step);  
    }else{  
    if(Input.GetKey(KeyCode.W)&timeout>=Speed && Hit.collider.name == "Grass"){  
    timeout = 0;  
    audio.PlayOneShot(step2);
    }else{     
    if(Input.GetKey(KeyCode.W)&timeout>=Speed && Hit.collider.name == "GoodDirt"){  
    timeout = 0;  
    audio.PlayOneShot(step3);      
    }else{        
    if(Input.GetKey(KeyCode.W)&timeout>=Speed && Hit.collider.name == "Cliff"){  
    timeout = 0;  
    audio.PlayOneShot(step4);      
    }                              
    }
    }
    }    
    }  
    }
    NEBRДата: Четверг, 12 Декабря 2013, 15:02 | Сообщение # 5129
    почти ветеран
    Сейчас нет на сайте
    Adom, у меня есть отличный контроллер, писал его с полгода назад. С другого компа достану и вышлю тебе ближе к вечеру, там шаги по разным поверхностям, приседания, бег (звук шагов тоже убыстряется при этом), прыжки в воду (всплеск), плавание (под водой, над водой) со звуками гребков и прочие фишки. Разберешься в нем, может почерпнешь что нибудь для своего

    King Size #Gamiron12
    AdomДата: Четверг, 12 Декабря 2013, 15:04 | Сообщение # 5130
    Печенька!
    Сейчас нет на сайте
    NEBR, ооо спасибо =)
    Буду очень признателен ).
    И плюс в репу тебе )
    allodsДата: Четверг, 12 Декабря 2013, 15:38 | Сообщение # 5131
    почти ветеран
    Сейчас нет на сайте
    Цитата NEBR ()
    у меня есть отличный контроллер

    А волнового алгоритма у тебя не завалялось ? smile

    Пытаюсь сохранить массивы и загрузить потом

    Код
    PlayerPrefs.SetInt("caseBag"+[i],caseBag[i]);
    PlayerPrefs.SetString("caseItemName"+[i],caseItemName[i]);


    а гружу так

    Код
    if(PlayerPrefs.GetInt("caseBag"+[i]))
          caseBag[i]=PlayerPrefs.GetInt("caseBag"+[i]);
         if(PlayerPrefs.GetString("caseItemName"+[i]))
          caseItemName[i]=PlayerPrefs.GetString("caseItemName"+[i]);


    но чот пусто cry

    Добавлено (12.12.2013, 15:38)
    ---------------------------------------------
    ох лол сколько муки из за этого, надо вот так делать

    Код
    if(PlayerPrefs.GetInt(""+caseBag+"["+i+"]"))
           caseBag[i]=PlayerPrefs.GetInt(""+caseBag+"["+i+"]");
    if(PlayerPrefs.GetString(""+caseItemName+"["+i+"]"))
           caseItemName[i]=PlayerPrefs.GetString(""+caseItemName+"["+i+"]");


    и тоже самое для сохранения


    Сообщение отредактировал allods - Четверг, 12 Декабря 2013, 15:39
    NEBRДата: Четверг, 12 Декабря 2013, 16:07 | Сообщение # 5132
    почти ветеран
    Сейчас нет на сайте
    allods, только плюсы надо было добавить? Хорошо что ты разобрался, мне скоро предстоит то же самое, искал бы.
    А волновые алгоритмы... опиши подробнее, что нужно? )


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Четверг, 12 Декабря 2013, 16:08
    allodsДата: Четверг, 12 Декабря 2013, 19:30 | Сообщение # 5133
    почти ветеран
    Сейчас нет на сайте
    создаю 2йной массив

    var point:int[ , ];

    потом хочу вписать в него

    point[x ,y ]=1;

    но получаю ошибку

    A null value was found where an object instance was required

    что делать

    Добавлено (12.12.2013, 16:09)
    ---------------------------------------------
    Цитата NEBR ()
    только плюсы надо было добавить?

    да для [ ] плюсы и в +" "+ вот так+ "["+ иначе скобки не засчитает =) а я всю ночь вчера возился! толкь вот недавно подумал что может скобки не прописываются и что может их надо в ручную вписывать

    Добавлено (12.12.2013, 16:12)
    ---------------------------------------------
    Цитата allods ()
    А волновые алгоритмы... опиши подробнее, что нужно? )

    Да хоть полу готовый, как примерно в героях3 в бою. В инете для юнити вообще 0 по волновому. А сам вообще не догоняю

    Добавлено (12.12.2013, 16:48)
    ---------------------------------------------
    короче еще одна заметочка

    Код
    caseBag[i]=PlayerPrefs.GetInt("caseBag"+"["+i+"]");

    а не
    Код
    caseBag[i]=PlayerPrefs.GetInt(""+caseBag+"["+i+"]");


    Добавлено (12.12.2013, 18:48)
    ---------------------------------------------
    Никто не может помочь с двумерным массивом ? как его создавать и заполнять?

    Добавлено (12.12.2013, 19:30)
    ---------------------------------------------
    кое как нашел на англоязычном форуме

    Код
    public var caseItemStat:int[,] = new int[10,10];


    Сообщение отредактировал allods - Четверг, 12 Декабря 2013, 19:32
    NEBRДата: Суббота, 14 Декабря 2013, 09:03 | Сообщение # 5134
    почти ветеран
    Сейчас нет на сайте
    Adom, извини, забыл позавчера контроллер найти. Выкладываю сегодня, как говорится, лучше поздно...
    Вообщем на сцене стандартный юнити контроллер от первого лица со всеми его скриптами + я добавил некоторые, вот один из них, для звуков. Я заккоментил его, будут вопросы спрашивай.

    Код

    var FootSteps1 : AudioClip []; // в этот массив назначаем звуки шагов по земле, например
    var FootSteps2 : AudioClip [];   // в этот - звуки шагов по дереву
    var goWater : AudioClip;
    var StepTime : float = 0;        // Время шага.
    var audioSource : AudioSource;
    var stepping : boolean = false; // Шагаем? По умолчанию нет.
    var controller : CharacterController;
    var type : boolean = false;
    function Awake() {
    controller = GetComponent(CharacterController);
    }

    function Update () {
    var hit : RaycastHit;
    if (Physics.Raycast (transform.position, -Vector3.up, hit)) { // выпускаем луч от игрока вниз
    if ((hit.collider.name == "Terrain") || (hit.collider.name == "water")) { // если луч уперся в терраин или в воду
    type = false;      
    }
    else {
    type = true;
    }
    }
    if(controller.isGrounded){   // если персонаж на земле тогда...
    if(!stepping){               // если персонаж не шагает тогда...

    if (Input.GetButton("Vertical") || Input.GetButton("Horizontal")){   // нажата ли клавиши ходьбы.

    if(Input.GetKey(KeyCode.LeftShift)) { //если нажата клавиша бега
    StepTime = 0.3;  // время между звуками шагов делаем 0.3с
    }
    else if(Input.GetKey(KeyCode.LeftControl)) { // если нажали приседание
    StepTime = 0.8;  // время между шагами длаем 0.8с
    }
    else {
    StepTime = 0.5; // если нажата просто клавиша ходьбы, время шага 0.5
    }               
    footfall();
    }    
    }
    }
    }

    function footfall(){
        stepping = true;
        if(type){
        audioSource.PlayOneShot (FootSteps2[Random.Range(0,FootSteps1.length)]);
        yield WaitForSeconds (StepTime);    
        stepping = false;
        }
        else {
        audioSource.PlayOneShot (FootSteps1[Random.Range(0,FootSteps1.length)]);
        yield WaitForSeconds (StepTime);    
        stepping = false;
        }
    }

    function GoWater() {     // эта функция вызывалась из другого скрипта. Она проигрывает звук прыжка в воду, всплеск
    audioSource.PlayOneShot (goWater);
    }


    здесь можно скачать мою сценку с этим скриптом (60 мб)


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Суббота, 14 Декабря 2013, 09:08
    NEBRДата: Суббота, 14 Декабря 2013, 09:11 | Сообщение # 5135
    почти ветеран
    Сейчас нет на сайте
    Цитата allods ()
    да для [ ] плюсы и в +" "+ вот так+ "["+ иначе скобки не засчитает =) а я всю ночь вчера возился! толкь вот недавно подумал что может скобки не прописываются и что может их надо в ручную вписывать

    спасибо, возьмем на заметку!
    Цитата allods ()
    Да хоть полу готовый, как примерно в героях3 в бою. В инете для юнити вообще 0 по волновому. А сам вообще не догоняю

    коллега реализует поиск пути, посмотри ссылки в его теме, я видел пару интересных


    King Size #Gamiron12

    Сообщение отредактировал NEBR - Суббота, 14 Декабря 2013, 09:16
    AdomДата: Суббота, 14 Декабря 2013, 11:56 | Сообщение # 5136
    Печенька!
    Сейчас нет на сайте
    Эмм тут загвоздка одна...
    Я делаю это все на шарпе и он ругается на AudioSource FootSteps1[];

    Добавлено (14.12.2013, 11:51)
    ---------------------------------------------
    А не все уже разобрался )

    Добавлено (14.12.2013, 11:56)
    ---------------------------------------------
    Блин опять не получается =(

    Код
    using UnityEngine;  
    using System.Collections;  

    public class ControllerD : MonoBehaviour {  
    public Transform Player;      
    private RaycastHit Hit;  
    public AudioClip cel;
    public float StepTime = 0;
    public bool stepping = false;
    CharacterController controller;
    bool type = false;
    AudioSource audioSource;
    public AudioClip [] foot1;
    public AudioClip [] foot2;  
    // Use this for initialization  
    void Awake(){  
    controller = GetComponent<CharacterController>();
    }
    void Start () {   
    }  
    void Update(){  
    Vector3 Direction = Player.TransformDirection(Vector3.down);  
    if(Physics.Raycast(Player.position, Direction, out Hit,10000f)){      
    }         
    if (Input.GetButton("Vertical") || Input.GetButton("Horizontal")){    
    if(Input.GetKey(KeyCode.LeftShift)) { //если нажата клавиша бега  
    StepTime = 0.3f;  // время между звуками шагов делаем 0.3fс  
    }  
    else if(Input.GetKey(KeyCode.LeftControl)) { // если нажали приседание  
    StepTime = 0.8f;  // время между шагами длаем 0.8fс  
    }else {  
    StepTime = 0.5f; // если нажата просто клавиша ходьбы, время шага 0.5f  
    }                
    footfall();  
    }        
    }  
    void footfall(){   
    stepping = true;
    if(type){
    audioSource.PlayOneShot(foot2[Random.Range(0,foot1.length)]);// На это ругается =(   
    }
    }  
    }
    allodsДата: Суббота, 14 Декабря 2013, 16:38 | Сообщение # 5137
    почти ветеран
    Сейчас нет на сайте
    скопируй ошибку и кинь сюда, а то я свой волшебный шар и кофейную гущу оставил дома
    AdomДата: Суббота, 14 Декабря 2013, 16:57 | Сообщение # 5138
    Печенька!
    Сейчас нет на сайте
    allods, =) Окау
    Их там несколько
    error CS1061: Type `UnityEngine.AudioClip[]' does not contain a definition for `length' and no extension method `length' of type `UnityEngine.AudioClip[]' could be found (are you missing a using directive or an assembly reference?)

    error CS1502: The best overloaded method match for `UnityEngine.Random.Range(float, float)' has some invalid arguments

    error CS1503: Argument `#2' cannot convert `object' expression to type `float'
    castielblackДата: Суббота, 14 Декабря 2013, 17:11 | Сообщение # 5139
    почетный гость
    Сейчас нет на сайте
    Код
    audioSource.PlayOneShot(foot2[Random.Range(0,foot1.Length)]);

    Вот так эта строчка должна выглядеть.


    Знания : C#, Lua, C++, Unity, Dreemchest, DirectX 11
    Выпущенные проекты : BuildAndRun, Match 3 Cubes
    NEBRДата: Суббота, 14 Декабря 2013, 17:13 | Сообщение # 5140
    почти ветеран
    Сейчас нет на сайте
    Adom в C# Length надо писать с большой буквы

    King Size #Gamiron12

    Сообщение отредактировал NEBR - Суббота, 14 Декабря 2013, 17:13
    Поиск:

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