Понедельник, 02 Декабря 2024, 08:55

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Результаты поиска
ChazДата: Понедельник, 20 Января 2014, 15:48 | Сообщение # 21 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
set16, дааа, разбиратся в этом я буду долго, оно ездит как машинка, кстате. И все-равно весит на стенке
ChazДата: Понедельник, 20 Января 2014, 14:43 | Сообщение # 22 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
allods, ну я еще могу использовать и треггеры и переменную от CharacterController'a. Триггер работает, когда персонаж на земле, а CharacterController.isGrounded хорошо работает, когда перс в воздухе
upd: фигню я сморозил, тогда буду дожидатся ответа Левши или запилю рейкастом.
upd2: сделал постоянную гравитацию, ну и ясный пень, теперь работает все чотко, но все рарвно интересно, почему же триггер на выходе не срабатывает

Добавлено (20.01.2014, 14:43)
---------------------------------------------
Значит сделал постоянную гравитацию + рейкаст. Но вот же проблема, лучик тоненький, а персонаж толстенький, и вот на этом скриншоте

если основыватся на данных полученных из рейкаста - персонаж в воздухе, хотя на самом деле он стоит на очень крутой горке. У меня движение пока что так сделано, что персонажем можно двигать и в воздухе, поэтому я могу спустится с этой горки, но в реале же мы не можем управлять направлением полета, если прыгнем вперед, например, и тогда, значит, если персонаж не на земле, то он не может двигатся ,и если он повиснет на таком крутом склоне, как на скриншоте, то он там застрянет на всю жизнь.

Сообщение отредактировал Chaz - Воскресенье, 19 Января 2014, 23:52
ChazДата: Воскресенье, 19 Января 2014, 15:53 | Сообщение # 23 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, ой! у меня тоже детектиться, но как-то плохо, триггер на вход и на нахождение чего-то в триггере не работает сразу, нужно поколотить персонажа, и тогда тока все срабатывает, и то криво работает. Вот я видюшку записал, значение True и False в консоли, относятся к CharacterController.isGrounded, а остальные штуки относятся к искусственной переменной isGrounded. Как вы и говорили, триггер на выход не срабатывает, а триггер на нахождение внутри работает даже если сферка очень далеко от земли.
ВИДЮШКА
ChazДата: Воскресенье, 19 Января 2014, 04:24 | Сообщение # 24 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, риджидБадя и так уже висела, и с IsKinematic триггеры как-раз не детектятся, но я убрал IsKinematic и просто зафризил риджидБадю, и тогда триггеры детектятся, но проблема все же осталась, я позже видюшку запишу и покажу вам, увидите насколько это все абсурдно, когда с одной части обрыва персонаж падает, а с другой нет =(
ChazДата: Суббота, 18 Января 2014, 21:30 | Сообщение # 25 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, хм, а у меня работает только если в воздухе, окей, сделаю, чтобы всегда работала хД надеюсь, это никак не отразится на перемещении. И это, а как мне тогда ускорение гравитации сделать? у меня просто такое условие - если перс в воздухе, то двигаем его вниз, и увеличиваем скорость падения, а когда на земле, то значение скорости обнуляется и он не падает вниз.
ChazДата: Суббота, 18 Января 2014, 20:34 | Сообщение # 26 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, та же фигня
ChazДата: Суббота, 18 Января 2014, 20:01 | Сообщение # 27 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Цитата Левша ()
Цитата
Debug.Log(controller.isGrounded);

да вы не это не обращайте внимания, это оно просто осталось в дебаг логе
вы сюда смотрите
Код
void FixedUpdate()  
       {  
           if (Input.GetKeyDown(KeyCode.Space))  
           {  
               if (isGrounded)//controller.isGrounded)  
                   Yjump = 1f;  
           }  

           if (Yjump != 0 || Yjump>0)  
           {      
               controller.Move(myTrans.up*Yjump);  
               Yjump -= Time.deltaTime;  
               if (Yjump < 0)  
                   Yjump = 0;  
           }  

           if (!isGrounded)  
           {  
               fallSpeed += 0.5f;  
               controller.Move(Vector3.down * Time.deltaTime * fallSpeed);  
           }  
       }  

       void OnTriggerEnter(Collider other)  
       {  
           if (other.tag == "Ground")  
           {  
               isGrounded = true;  
                   Yjump = 0;  
                   fallSpeed = 0;  
               Debug.Log("grounded from enter");  
           }  
       }  

       void OnTriggerExit(Collider other)  
       {  
           if (other.tag == "Ground")  
           {  
               isGrounded = false;  
               Debug.Log("ungrounded!");  
           }  
       }  

       void OnTriggerStay(Collider other)  
       {  
           if (other.tag == "Ground")  
           {  
               isGrounded = true;  
               Debug.Log("grounded from stay");  
           }  
       }  
}
ChazДата: Суббота, 18 Января 2014, 19:53 | Сообщение # 28 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, так я так и делаю, isGrounded это моя переменная, а не от CharacterController'а
ChazДата: Суббота, 18 Января 2014, 18:36 | Сообщение # 29 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
слушайте, глюк какой-то. Нацепил на персонажа сферический коллайдер, поставил галочку напротив is trigger. Далее назначил земле тег Ground и написал такой код
Код
using System;
using System.Timers;
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{

      public float speed;
      public float fallSpeed = 1;
      public bool isGrounded = false;

      private Transform camera, player, mesh;
      private SphereCollider sphereCollider;
      private Transform myTrans;
      private Vector3 direction;
      private CharacterController controller;
      private Vector3 rotVect;
      private float Yjump;
        

   // Use this for initialization
   void Start ()
   {
       direction = Vector3.zero;
       speed = speed == 0 ? 10:speed;
       camera = GameObject.FindGameObjectWithTag("Camera").transform;
       player = GameObject.FindGameObjectWithTag("Player").transform;
          mesh = GameObject.FindGameObjectWithTag("Mesh").transform;
       sphereCollider = gameObject.GetComponent<SphereCollider>();
       myTrans = transform;
       controller = this.gameObject.GetComponent<CharacterController>();
   }
     
   // Update is called once per frame
   void Update ()
   {
       direction = Vector3.zero;

       if (Input.GetKey(KeyCode.W))
       {
           direction += camera.forward;
           direction.y = 0;
       }

          if (Input.GetKey(KeyCode.S))
          {
              direction += -camera.forward;
              direction.y = 0;
          }

          if (Input.GetKey(KeyCode.D))
          {
              direction += camera.right;
              direction.y = 0;   
          }

          if (Input.GetKey(KeyCode.A))
          {
              direction += -camera.right;
              direction.y = 0;
          }

       if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
       {
           mesh.forward = direction.normalized;
           controller.Move(direction.normalized*speed*Time.deltaTime);
             // myTrans.Translate(direction.normalized * speed * Time.deltaTime);
       }
          Debug.Log(controller.isGrounded);
   }

      void FixedUpdate()
      {
          if (Input.GetKeyDown(KeyCode.Space))
          {
              if (isGrounded)//controller.isGrounded)
                  Yjump = 1f;
          }

          if (Yjump != 0 || Yjump>0)
          {     
              controller.Move(myTrans.up*Yjump);
              Yjump -= Time.deltaTime;
              if (Yjump < 0)
                  Yjump = 0;
          }

          if (!isGrounded)
          {
              fallSpeed += 0.5f;
              controller.Move(Vector3.down * Time.deltaTime * fallSpeed);
          }
      }

      void OnTriggerEnter(Collider other)
      {
          if (other.tag == "Ground")
          {
              isGrounded = true;
                  Yjump = 0;
                  fallSpeed = 0;
              Debug.Log("grounded from enter");
          }
      }

      void OnTriggerExit(Collider other)
      {
          if (other.tag == "Ground")
          {
              isGrounded = false;
              Debug.Log("ungrounded!");
          }
      }

      void OnTriggerStay(Collider other)
      {
          if (other.tag == "Ground")
          {
              isGrounded = true;
              Debug.Log("grounded from stay");
          }
      }
}

Пока хожу по ровной земле и по пологим горбикам - все нормально работает. Но когда я поднимаюсь на горбик и пытаюсь сойти с обрыва, то я остаюсь в воздухе, хожу по воздуху и триггер
Код
void OnTriggerStay(Collider other)
      {
          if (other.tag == "Ground")
          {
              isGrounded = true;
              Debug.Log("grounded from stay");
          }
      }
постоянно срабатыват, хотя я не стою на земле, че это за глюк такой???


Сообщение отредактировал Chaz - Суббота, 18 Января 2014, 18:40
ChazДата: Суббота, 18 Января 2014, 17:36 | Сообщение # 30 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Левша, а я думал пускать луч из ног, и проверять дистанцию до точки столкновения, это норм или лучше сфера колайдер?
ChazДата: Суббота, 18 Января 2014, 17:03 | Сообщение # 31 | Тема: Каким образом перемещать персонажа по неровной поверхности?
частый гость
Сейчас нет на сайте
Привет. Такая беда. Если перемещать персонажа при помощи CharacterController.Move, то значение CharacterController.isGrounded меняется каждый раз, когда я иду по ровной поверхности. Оно будет false, если я подпрыгну, и будет true, если я стою на земле, но когда я иду, то оно меняется из false в true и обратно много раз подряд. Если использовать Translate для передвижения персонажа, то значение isGrounded стабильно, то есть, если на земле, то true, если в воздухе, то false, если двигаюсь по земле, то true, но если я пытаюсь забратся на горбик или ввойти в стену, то я прохожу сквозь меш, а CharacterController.Move позволяет подниматся на горку и останавливатся, если переоснаж двигается в стену. Подскажите же, как сделать, чтобы персонаж и на горку поднимался и при ходьбе по земле значение isGrounded было true?
Вот скрипт, может я неверно двигаю персонажа методом Move?
Код

using System;
using System.Timers;
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{

     public float speed;
     public float fallSpeed = 1;

     private Transform camera, player;

     private Transform myTrans;
     private Vector3 direction;
     private CharacterController controller;
     private Vector3 rotVect;
     private float Yjump;

         // Use this for initialization
         void Start ()
         {
             direction = Vector3.zero;
             speed = speed == 0 ? 10:speed;
             camera = GameObject.FindGameObjectWithTag("Camera").transform;
             player = GameObject.FindGameObjectWithTag("Player").transform;
             myTrans = transform;
             controller = this.gameObject.GetComponent<CharacterController>();
         }
          
         // Update is called once per frame
         void Update ()
         {
             direction = Vector3.zero;

             if (Input.GetKey(KeyCode.W))
             {
                 direction += camera.forward;
                 direction.y = 0;
             }

         if (Input.GetKey(KeyCode.S))
         {
             direction += -camera.forward;
             direction.y = 0;
         }

         if (Input.GetKey(KeyCode.D))
         {
             direction += camera.right;
             direction.y = 0;  
         }

         if (Input.GetKey(KeyCode.A))
         {
             direction += -camera.right;
             direction.y = 0;
         }

             if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D))
             {
                 myTrans.forward = direction.normalized;
                 //controller.Move(direction.normalized*speed*Time.deltaTime);
             myTrans.Translate(direction.normalized * speed * Time.deltaTime);
             }
         Debug.Log(controller.isGrounded);
         }

     void FixedUpdate()
     {
         if (Input.GetKeyDown(KeyCode.Space))
         {
             if (controller.isGrounded)
                 Yjump = 1f;
         }

         if (Yjump != 0 || Yjump>0)
         {    
             controller.Move(myTrans.up*Yjump);
             Yjump -= Time.deltaTime;
             if (Yjump < 0)
                 Yjump = 0;
         }

         if (!controller.isGrounded)
         {
             fallSpeed += 0.5f;
             controller.Move(Vector3.down * Time.deltaTime * fallSpeed);
             if (controller.isGrounded)
             {
                 Yjump = 0;
                 fallSpeed = 1;
             }
         }      
     }
}
  
ChazДата: Среда, 15 Января 2014, 23:22 | Сообщение # 32 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
Левша, вы самый гениальный человек в мире хД это ж как можно было это узнать??? я вижу проект и то не допер, а вы как провидец увидели саму суть проблемы хД так все и было, дочерним к персонажу был бокс с коллайдером, он мне был нужен, чтобы можно было нормально крутить камеру хД убрал коллайдер - и все заработало biggrin
ChazДата: Среда, 15 Января 2014, 22:30 | Сообщение # 33 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
Левша, ну слушайте, тогда бы оно вообще не двигалось, а так оно не двигается тока при определенных условиях, написал вот так
Код
controller.Move(myTrans.forward*2*Time.deltaTime);
- та же беда
ChazДата: Среда, 15 Января 2014, 20:30 | Сообщение # 34 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
seaman,
вот это висит на персе
Код
using System;
using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{

     private Transform camera;

     private Transform myTrans;
     private Vector3 posVect;
     private CharacterController controller;
     private Vector3 rotVect;

  // Use this for initialization
  void Start ()
  {
      camera = GameObject.FindGameObjectWithTag("Camera").transform;
      myTrans = transform;
      controller = this.gameObject.GetComponent<CharacterController>();
  }
   
  // Update is called once per frame
  void Update () {
      if (Input.GetKey(KeyCode.W))
      {
             rotVect = myTrans.eulerAngles;
             rotVect.y = camera.eulerAngles.y;
             myTrans.eulerAngles = rotVect;
             Debug.Log("forward is: "+myTrans.forward);
             controller.Move(myTrans.forward);
      }
         if (Input.GetKey(KeyCode.S))
         {
             rotVect = myTrans.eulerAngles;
             rotVect.y = camera.eulerAngles.y;
             myTrans.eulerAngles = rotVect;
             controller.Move(-myTrans.forward);
         }
         if (Input.GetKey(KeyCode.D))
         {
             //controller.Move();
         }
         if (Input.GetKey(KeyCode.A))
         {
             //controller.Move();
         }
  }
}

а вот это на камере
Код
using System;
using UnityEngine;
using System.Collections;

public class TPCamera : MonoBehaviour
{
     private GameObject LookPoint;
     public float speedX, speedY, x, y;
     public bool isActivated;
     private Transform myTrans;
     private Quaternion tmpRot;
     private float maxDist;
     private Vector3 tmpPos;
     private float YOffset;

     // Use this for initialization
     private void Start()
     {
         maxDist = 5;
         LookPoint = GameObject.FindGameObjectWithTag("LookPoint");
         if (speedX == 0 && speedY == 0)
             speedY = speedX = 3;
         isActivated = false;
         myTrans = transform;
         y = myTrans.rotation.x;
         x = myTrans.rotation.y;
         tmpRot = myTrans.rotation;
         LookPoint.transform.rotation = Quaternion.EulerAngles(0, myTrans.rotation.y, 0);
     }

     private void LateUpdate()
     {

         if (Input.GetMouseButtonDown(1))
             isActivated = true;
         if (Input.GetMouseButtonUp(1))
             isActivated = false;
         if (isActivated)
         {
             LookPoint.transform.forward = myTrans.forward;
             x = Input.GetAxis("Mouse X") * speedX;
             y = Input.GetAxis("Mouse Y") * speedY;

             myTrans.RotateAround(LookPoint.transform.position, LookPoint.transform.up, x);
             myTrans.RotateAround(LookPoint.transform.position, -LookPoint.transform.right, y);

             myTrans.rotation = Quaternion.EulerAngles(myTrans.rotation.x, myTrans.rotation.y, 0);
         }

         myTrans.LookAt(LookPoint.transform);
         YOffset = myTrans.position.y;
         if (Vector3.Distance(LookPoint.transform.position, myTrans.position) > maxDist)
         {
             //Debug.Log(Vector3.Distance(LookPoint.transform.position, myTrans.position)+" : "+maxDist);
             tmpPos = myTrans.position;
             tmpPos = (-myTrans.forward*maxDist) + LookPoint.transform.position;
             tmpPos.y = YOffset;
             myTrans.position = tmpPos;
         }
     }
}
ChazДата: Среда, 15 Января 2014, 19:55 | Сообщение # 35 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
robertono, да ладно, может это я такой тупой, что не вижу его там, ану скажите ка мне, почему же Move не двигает перса?
ChazДата: Среда, 15 Января 2014, 18:14 | Сообщение # 36 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
Левша, А там есть овтет на мой вопрос? smile
ChazДата: Среда, 15 Января 2014, 14:58 | Сообщение # 37 | Тема: Как работает метод Move скрипта CharacterController?
частый гость
Сейчас нет на сайте
Привет. Смотрите какая задача, нужно двигать персонажа в ту сторону, в которую смотрит камера. Для этого я беру одно из значений углов Эйлера камеры и присваиваю его одному из значений углов Эйлера персонажа. То есть, если камера смотрит вправо и вниз, то я беру лишь то значение, которое отвечает за поворот камеры ГОРЫЗОНТАЛЬНО, от есть персонаж будет смотреть вправо, но не вниз, а туда, куда он и раньше смотреть по вертикали, но вправо. Вы поняли да? После этого, я двигаю персонада методом Move() и передаю как аргумент вектор forward трансформы персонажа. Таким образом, он должен двигатся в ту сторону, в которую смотрит его локальная ось Z, а направление оси Z я получаю через камеру, ну куда камера смотрит, туда и ось Z персонажа поворачивается. Проблема в том, что если локальная ось Z персонажа смотрит в противоположную сторону глобальной оси Z, то персонаж перестает двигатся. Но если двигать персонажа в сторону локальной оси Z таким образом
Код

transform.position+=transform.forward;

то персонаж замечательно двигается во все стороны, НО, если на пути персонажа есть какая-то горка, то она не поднимается на нее, как это случается при использовании метода Move, а просто проходит сквозь эту горку.
Расскажите же мне, пожалуйста, как заставить персонажа двигатся в нужную тебе сторону, при помощи метода Move() ?
ChazДата: Пятница, 20 Сентября 2013, 03:06 | Сообщение # 38 | Тема: Как настроить кривые в Shuriken'e ?
частый гость
Сейчас нет на сайте
Прив. Хочу сделать, чтобы партиклы двигались по спиральке. Так вот, пошаманив над Velocity over Lifetime я сделал спиральку, но она имеет только одну завитушку. Чтобы сделать две завитушки, мне пришлось подредактировать кривые. Сами кривые не изменили своей формы, а стали просто плотнее. И такое изменение: во-первых неточное, так как я на глаз раставляю вертексы кривой, а во-вторых занимает много времени, ведь если мне надо будет десять завитушек на спиральке, то мне придется очень долго создавать и расставлять вертексы на кривой. Ладно еще, если бы у меня было задание сделать столько-то завитушек, то я бы сел и сделал уже, ведь это надо было бы делать 1 раз, но я ж не знаю, какое количество завитушек будет красивей смотрется для моего какого-то там эффекта, а редактировать каждый раз кривую - очень долго. Есть ли способ, которым можно легко управлять траекторией полета партиклов?
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск:

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