@qwertygameover

Трясучка персонажа при столкновении с преградами и при передвижении, как зафиксить?

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

public class PlayerMovement : MonoBehaviour
{

    public float playerspeedRL = 5.0f;
    public float playerspeed = 1.0f;
    public FixedJoystick joystick;

    void Start()
    {
        
    }

    void Update()
    {
        transform.position += new Vector3(joystick.Direction.x * playerspeedRL * Time.deltaTime, 0, playerspeed * Time.deltaTime);
    }
}


Буквально одна строчка кода, при движении перса он проваливается и одновременно выталкивается снизу, а так же если его упереть в стенку он так же выталкивается, можете пожалуйста помочь
  • Вопрос задан
  • 59 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Tiksten
Передвижение персонажа лучше делать через AddForce

Вот пример из моего проекта

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

public class PlayerMovement : MonoBehaviour
{
    public CharacterController controller;

    public AudioClip[] steps;
    public AudioSource audioSource;
    private bool stepPlayed;
    public float timeBetweenSteps;

    public float speed = 12f;
    public float gravity = -9.81f;
    public float jumpHeight = 3f;

    public Transform groundCheck;
    public float groundDistance = 0.4f;
    public LayerMask groundMask;

    Vector3 velocity;
    bool isGrounded;

    // Update is called once per frame
    void Update()
    {
        isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);

        if (isGrounded && velocity.y < -2f)
            velocity.y = -2f;

        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = transform.right * x + transform.forward * z;

        controller.Move(move * speed * Time.deltaTime);

        if (Input.GetButtonDown("Jump") && isGrounded)
            velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);

        velocity.y += gravity * Time.deltaTime;

        controller.Move(velocity * Time.deltaTime);

        StepSoundPlay();
    }

    private void StepSoundPlay()
    {
        if (!stepPlayed)
        {
            if (isGrounded && (Input.GetAxisRaw("Vertical") != 0 || Input.GetAxisRaw("Horizontal") != 0))
            {
                stepPlayed = true;
                audioSource.clip = steps[Random.Range(0, steps.Length)];
                audioSource.Play();
                StartCoroutine(Wait());
            }
        }
    }

    private IEnumerator Wait()
    {
        yield return new WaitForSeconds(timeBetweenSteps);
        stepPlayed = false;
    }
}


Данный код подходит для First Person игр
Так же в нем есть шаги (StepSounds)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы