как настроить движение контроллера персонажа от первого лица

#c# #unity3d

Вопрос:

я пытаюсь создать контроллер персонажа от первого лица для игры, которую я создаю, для этого не нужны ни прыжки, ни быстрые скорости, ни какие-либо дополнительные движения, практически просто ходьба и размахивание оружием. Я добавлю к этому, прямо сейчас, хотя первый человек находится вне моей зоны комфорта, я создал контроллер персонажа от третьего лица иэто было не ТАК сложно, я в основном пытаюсь изменить прямой вектор капсулы игрока на что-то более совместимое с input.getaxis, в настоящее время у меня беспорядок Франкенштейна, который почти не работает, но движение камеры функционирует просто отлично, с моей текущей настройкой я использую жесткое тело для управления плеером, и яв идеале я хочу использовать velocity, а не addforce или moveposition, velocity пока дал мне наилучшие результаты, как я могу исправить свое движение:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class characterController : MonoBehaviour {
    //variables and functions
    public float moveSpeed = 0.1f;
    public bool tweening = false;
    public bool jumping = false;
    public bool reteleporing = false;
    bool walking = false;
    public bool ragdolled = false;
    public Vector3 smoothedvel;
    public Vector3 smoothedrotationalvector;
    public Vector3 cameraoffset;
    void Start () {
        cameraoffset = new Vector3(0,0,0);
        smoothedvel = new Vector3(0,0,0);
        moveSpeed = 5;
    }
    
    void Update (){
        //movement
        smoothedrotationalvector = Vector3.Lerp(smoothedrotationalvector, new Vector3(-Input.GetAxis("Vertical"),0,Input.GetAxis("Horizontal")), 0.2f);
        if (new Vector3(Input.GetAxis("Vertical"),0,Input.GetAxis("Horizontal")).magnitude != 0)
        {
            transform.LookAt(GameObject.Find("Main Camera").GetComponent<Camera>().transform.position, -Vector3.up);
            transform.localEulerAngles = new Vector3(0,transform.localEulerAngles.y,0);
        }
        if (transform.position.y < -100)
        {
            reteleporing = true;
        }
        if (reteleporing == true)
        {
            transform.position = GameObject.Find("spawnpos").transform.position;
        }
        if (transform.position.y > 2.4)
        {
            reteleporing = false;
        }
        if (reteleporing == false)
        {
            if (new Vector3(Input.GetAxis("Vertical"),0,Input.GetAxis("Horizontal")).magnitude != 0)
            {
                float axisX = Input.GetAxis("Horizontal") * moveSpeed;
                float axisZ = Input.GetAxis("Vertical") * moveSpeed;

                Vector3 moveDirection = transform.right * axisX   transform.forward * axisZ;

                gameObject.GetComponent<Rigidbody>().velocity = moveDirection;
            }
        }
        if (new Vector3(Input.GetAxis("Vertical"),0,Input.GetAxis("Horizontal")).magnitude != 0 amp; walking == false)
        {
            walking = true;
        }
        if (new Vector3(Input.GetAxis("Vertical"),0,Input.GetAxis("Horizontal")).magnitude == 0 amp; walking == true)
        {
            walking = false;
        }
        GameObject.Find("Main Camera").GetComponent<Camera>().transform.position = transform.position;
    }
}
 

Комментарии:

1. Несмотря на все избыточности и дорогостоящие вещи в вашем коде ( GetAxis пять раз вместо однократного обналичивания значения, дорогостоящее повторное использование Find без однократного обналичивания результата, флаги telepoerting и walking …), в чем именно проблема с вашим кодом? Что ведет себя не так, как ожидалось?

2. И кстати, почему бы вам просто не сделать камеру дочерним элементом вашего объекта player -> он будет перемещаться автоматически

3. И вы знаете, что у Unity уже есть CharacterController компонент .. почему бы просто не использовать это?

4. ну, чтобы решить пару вещей, я просто хочу получить совет о том, как я могу создать хороший контроллер персонажа для первого лица с нуля, я посмотрел на YouTube и, похоже, не могу найти то, что я ищу (контроллер персонажа от первого лица, который использует rigidbody velocity, а не addforce, как люди обычно публикуют, или перемещение, как люди также публикуют) пожалуйста, имейте в виду, что я новичок, поэтому я буду оптимизировать код в будущем, я не использую компонент контроллера персонажа, потому что я хочу столько контроля, сколько целесообразно для разработки игры

5. вот пара вещей, которые я хочу знать, чтобы сузить круг моих желаний: я хочу знать, как я могу использовать getaxis со скоростью, делая это относительно камеры, если бы вы нашли время протестировать часть моего кода, вы бы увидели, что технически это действительно так, это просто ужасно иедва функциональный, в основном хочу получить совет о том, как я могу «исправить» свой код, чтобы он действительно функционировал, когда вы идете вперед, вы идете вперед, когда вы идете назад, вы идете вперед, когда вы сходите с края, вы зависаете, потому что я не учитывал скорость. y (я не знаю, как) и другие проблемы, которые я могу исправить сам

Ответ №1:

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