Raycast и прыжки в воздухе

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Raycast и прыжки в воздухе

Сообщение Sojjjer 22 сен 2018, 10:41

Unity 2018.2.8f1
Проблема котрую очень долго пытаюсь исправить но ничего не помогает! Знаю такие вопросы уже были но они мне тоже не помогли. При прыжке персонажа в вохдухе данный персонаж будет подпрыгивать в воздухе пока нажимаешь пробел. Как сделать так чтобы персонаж не прыгал в воздухе, а прыгал только от земли. Решил сделать при помощи Raycast. Но написав скрипт галочка напротив Is Ground не появляется, и персонаж продолжает прыгать в воздухе. Как решить эту проблему?
Вот весь скрипт:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class nero : MonoBehaviour
{


Rigidbody2D rb;
Animator anim;
int Life = 100;

public int jumpForce;
public bool IsGround;


void Start()
{


rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();


}
void Update()


{
if (Input.GetKeyDown(KeyCode.Space))
{
jump();

}

if (Input.GetAxis("Horizontal") == 0)
{

anim.SetInteger("Lop", 1);
}
else {
Jump();
Flip();

anim.SetInteger("Lop", 2);
}

}



void OnTriggerEnter2D(Collider2D shit)
{
if (shit.gameObject.tag == "life")
{
Life++;
Destroy(shit.gameObject);
}

if (shit.gameObject.tag == "Finish")

Application.LoadLevel("Scene2");

}


void OnCollisionEnter2D(Collision2D shit)
{
if (shit.gameObject.tag == "swes")
{
//Invoke("ReloadFuckingLevel", 3);
Life--;
}
}

void OnGUI()
{
GUI.Box(new Rect(0, 0, 100, 30), "Life = " + Life);

}

void ReloadFuckingLevel()
{
Application.LoadLevel(Application.loadedLevel);
}

void Flip()
{
if (Input.GetAxis("Horizontal") < 0) transform.localRotation = Quaternion.Euler(0, 0, 0);

if (Input.GetAxis("Horizontal") > 0) transform.localRotation = Quaternion.Euler(0, 180, 0);

}


void FixedUpdate()



{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * 8f, rb.velocity.y);

}


void jump()
{
rb.AddForce(transform.up * 13f, ForceMode2D.Impulse);


if (Input.GetKeyDown(KeyCode.Space))
{
GetComponent<Rigidbody2D>().AddForce(Vector2.up * 300);

}


}


public void Jump()
{

Ray ray = new Ray(gameObject.transform.position, Vector3.down);
RaycastHit rh;
if (Physics.Raycast(ray, out rh, 0.5f))
{
IsGround = true;
}
else {
IsGround = false;

}

if (Input.GetKeyDown(KeyCode.Space) && IsGround)
{
rb.AddForce(Vector3.up * jumpForce);
}


}
}
Sojjjer
UNец
 
Сообщения: 7
Зарегистрирован: 16 июл 2018, 19:21

Re: Raycast и прыжки в воздухе

Сообщение TheMamont 24 мар 2019, 13:25

Привет! Я использую такой способ
Синтаксис:
Используется csharp
RaycastHit hit;
bool ig;
void Update()
{
Ray ray = new Ray (transform.position, -transform.up );
if (Physics.Raycast(ray, out hit, 1)) {
if (hit.collider.gameObject.tag == "Ground"){ig=true;} 
}
else{ig=false;}
if (Input.GetKey(KeyCode.Space)&&ig==true){GetComponent<Rigidbody>().AddForce(0, 100, 0);;}
}
 

Ground - этот тег должен быть на земле
После out hit - расстояние индивидуально для всех, нужно немного подкорректировать в зависимости от размеров твоего персонажа.
Проще говоря мы запускаем из персонажа луч вниз и если он касается земли то придаем булке ig true иначе false.И когда проверяем нажатие пробле проверяем эту булку на true.
TheMamont
UNITрон
 
Сообщения: 198
Зарегистрирован: 21 мар 2019, 09:00

Re: Raycast и прыжки в воздухе

Сообщение mic900 24 мар 2019, 16:31

Используйте CharacterController - там уже есть готовый метод isGrounded, который все за вас делает и не нужно никаких рэйкастов.
Download paid Unity & UE4 assets
3d-модели для игр и дизайна
mic900
UNец
 
Сообщения: 19
Зарегистрирован: 08 мар 2018, 12:15


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1