@rkpuLll

Не работает скрипт движения персонажа. Что делать?

Хочу сделать 2d игру с видом сбоку. Написал скрипт, но он не работает.
Версия Unity 2019.1.12f1

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

public class HCtrL : MonoBehaviour
{
    [SerializeField] private float speed =3f;
    [SerializeField] private int lives = 5;
    [SerializeField] private float jumpForce = 15f;
    private bool isGrounded = false;


    private Rigidbody2D rb;
    private SpriteRenderer sprite;


    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        sprite = GetComponentInChildren<SpriteRenderer>();
    }

    private void Update()
    {
        if (Imput.getButton("Horizontal"))
            Run();
        if (isGrounded $$ Input.getButtonDown("Jump"))
            Jump();
    }

    private void Run()
    {
        Vector3 dir = transform.right * Input.GetAxis("Horizontal");

        transform.position = Vector3.MoveTovard(transform.position, transform.positiond + dir, speed * Time.deltaTime);

        sprite.flipX = dir.X < 0.0f;
    }

    private void Jump()
    {
        rb.AddForce(transform.up * jumpForce, ForceMod2D.Impulse);
    }

    private void CheckGround()
    {
        Collider2D[] collider = Physics2D.OverlapCircleAll(transform.position, 0.3f);
        isGrounded = colliderllider.Lengt >1;
    }
}
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 2
E1ON
@E1ON
web, gamedev, anime, science
А почему $$? Мне кажется там должно быть &&
if (isGrounded && Input.getButtonDown("Jump"))
            Jump();
Ответ написан
ReyGrau
@ReyGrau
Надеюсь это не рофл пост.
Так будет работать.

[SerializeField] private LayerMask _ground;
    [SerializeField] private Transform _groundCheckPoint;
    [SerializeField] private float _groundCheckRadius;
    
    [SerializeField] private float speed =3f;
    [SerializeField] private int lives = 5;
    [SerializeField] private float jumpForce = 15f;
    private float _horizontalInput;
    private bool isGrounded;
    


    private Rigidbody2D rb;
    private SpriteRenderer sprite;


    private void Awake()
    {
        rb = GetComponent<Rigidbody2D>();
        sprite = GetComponentInChildren<SpriteRenderer>();
    }

    private void Update()
    {
        //Input получать лучше в Update
        ProcessedInput();
        
        //Ты сначала выучи c#, потом на unity пиши, правильно не $$, а &&. Это же основы лол.
        //GetAxisRaw возращает float, а не bool
        if (CheckGround() && Input.GetButtonDown("Jump"))
            Jump();
    }

    private void FixedUpdate()
    {
        Run();
    }

    private void ProcessedInput()
    {
        //Лучше использовать GetAxisRaw, а не просто GetAxis, т.к. Raw возвращает числа -1 0 1, в отличие от GetAxis где числа не целые.
        _horizontalInput = Input.GetAxisRaw("Horizontal");
    }
    
    private void Run()
    {
        Vector3 dir = transform.right * _horizontalInput;
        
        //Не MoveTovard, а MoveTowards
        transform.position = Vector3.MoveTowards(transform.position, transform.position + dir, speed * Time.deltaTime);

        sprite.flipX = dir.x < 0.0f;
    }

    private void Jump()
    {
        //Ты где код пишешь? В блокноте? Почему столько ошибок???
        rb.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
    }

    //И как ты вообще получаешь isGrounded, если ты функцию нигде не вызываешь???
    private bool CheckGround()
    {
        //Используй LayerMask и на то, что у тебя ground поставь нужный LayerMask
        var collider = Physics2D.OverlapCircleAll(_groundCheckPoint.position, _groundCheckRadius, _ground);
       return isGrounded = collider.Length >= 1;
    }
    
    //Чтобы было легче настроить CheckGround
    private void OnDrawGizmosSelected()
    {
        if(_groundCheckPoint == null)
            return;
      
        Gizmos.DrawWireSphere(_groundCheckPoint.position, _groundCheckRadius);
    }
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы