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

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Как работает метод Move скрипта CharacterController?
ChazДата: Среда, 15 Января 2014, 14:58 | Сообщение # 1
частый гость
Сейчас нет на сайте
Привет. Смотрите какая задача, нужно двигать персонажа в ту сторону, в которую смотрит камера. Для этого я беру одно из значений углов Эйлера камеры и присваиваю его одному из значений углов Эйлера персонажа. То есть, если камера смотрит вправо и вниз, то я беру лишь то значение, которое отвечает за поворот камеры ГОРЫЗОНТАЛЬНО, от есть персонаж будет смотреть вправо, но не вниз, а туда, куда он и раньше смотреть по вертикали, но вправо. Вы поняли да? После этого, я двигаю персонада методом Move() и передаю как аргумент вектор forward трансформы персонажа. Таким образом, он должен двигатся в ту сторону, в которую смотрит его локальная ось Z, а направление оси Z я получаю через камеру, ну куда камера смотрит, туда и ось Z персонажа поворачивается. Проблема в том, что если локальная ось Z персонажа смотрит в противоположную сторону глобальной оси Z, то персонаж перестает двигатся. Но если двигать персонажа в сторону локальной оси Z таким образом
Код

transform.position+=transform.forward;

то персонаж замечательно двигается во все стороны, НО, если на пути персонажа есть какая-то горка, то она не поднимается на нее, как это случается при использовании метода Move, а просто проходит сквозь эту горку.
Расскажите же мне, пожалуйста, как заставить персонажа двигатся в нужную тебе сторону, при помощи метода Move() ?
ЛевшаДата: Среда, 15 Января 2014, 17:35 | Сообщение # 2
почти ветеран
Сейчас нет на сайте
а в мануал глянуть не судьба ? smile
CharacterController.Move


X.cor.R (Prologue)
ChazДата: Среда, 15 Января 2014, 18:14 | Сообщение # 3
частый гость
Сейчас нет на сайте
Левша, А там есть овтет на мой вопрос? smile
robertonoДата: Среда, 15 Января 2014, 19:50 | Сообщение # 4
Чокнутый Кот
Сейчас нет на сайте
Chaz, Там есть что то большее чем ответ - тысячи ответов на другие вопросы biggrin
ChazДата: Среда, 15 Января 2014, 19:55 | Сообщение # 5
частый гость
Сейчас нет на сайте
robertono, да ладно, может это я такой тупой, что не вижу его там, ану скажите ка мне, почему же Move не двигает перса?
seamanДата: Среда, 15 Января 2014, 20:08 | Сообщение # 6
старожил
Сейчас нет на сайте
Цитата
почему же Move не двигает перса?

Потому что Вы не умеете его двигать. Научитесь - будет двигаться как миленький.
Вы бы хоть код привели, который у Вас не двигает его...
ChazДата: Среда, 15 Января 2014, 20:30 | Сообщение # 7
частый гость
Сейчас нет на сайте
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;
         }
     }
}
ЛевшаДата: Среда, 15 Января 2014, 21:11 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата
controller.Move(-myTrans.forward);

Это только направление... а скорость?
Код
controller.Move(moveDirection * speed * Time.deltaTime);


X.cor.R (Prologue)

Сообщение отредактировал Левша - Среда, 15 Января 2014, 21:12
ChazДата: Среда, 15 Января 2014, 22:30 | Сообщение # 9
частый гость
Сейчас нет на сайте
Левша, ну слушайте, тогда бы оно вообще не двигалось, а так оно не двигается тока при определенных условиях, написал вот так
Код
controller.Move(myTrans.forward*2*Time.deltaTime);
- та же беда
ЛевшаДата: Среда, 15 Января 2014, 22:36 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
Может у тебя СС внутри другого колайдера помещен ? Если оно не триггер то вязнет намертво.

X.cor.R (Prologue)

Сообщение отредактировал Левша - Среда, 15 Января 2014, 22:48
ChazДата: Среда, 15 Января 2014, 23:22 | Сообщение # 11
частый гость
Сейчас нет на сайте
Левша, вы самый гениальный человек в мире хД это ж как можно было это узнать??? я вижу проект и то не допер, а вы как провидец увидели саму суть проблемы хД так все и было, дочерним к персонажу был бокс с коллайдером, он мне был нужен, чтобы можно было нормально крутить камеру хД убрал коллайдер - и все заработало biggrin
  • Страница 1 из 1
  • 1
Поиск:

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