Unity'de zıplama kodu yere inmek yerine havada duruyor

sirinbuba

Centipat
Katılım
6 Eylül 2023
Mesajlar
8
Daha fazla  
Cinsiyet
Erkek
Unity'de yaptığım oyundaki karaktere bu kodu ekledim.

Karakter hareket edebiliyor zıplayabilir ama zıplayınca yere inmek yerine havada duruyor, uzun süre sonra yere iniyor. Sorunun groundCheckte olduğunu düşünüyorum çünkü groundCheck karakterin gövde hizasında iken bu sorun oluşmuyor ama ayağında iken bu sorun oluyor. İleride sorun olur mu olmaz mı şu an amacım ileride bakıp aklım karışmasın diye yapmayı istiyorum.

Kod:
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;

[RequireComponent(typeof(CharacterController))]

public class PlayerMovement : MonoBehaviour.
{
 Rigidbody rb;
 CharacterController controller;

 public float speed;
 public float gravity;
 public float jumpHeight;
 public float minJump;

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

 public float originalHeight;
 public float crouchHeight;

 Vector3 velocity;
 bool isGrounded;

 private void Awake()
 {
 controller = GetComponent<CharacterController>();
 }

 private void Start()
 {
 Cursor.lockState = CursorLockMode.Locked;
 Cursor.visible = true;
 }

 void Update()
 {

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

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

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

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

 #region Crouch.
 if (Input.GetKeyDown(KeyCode.LeftControl))
 {
 controller.height = crouchHeight;

 }

 if(Input.GetKeyUp(KeyCode.LeftControl))
 controller.height = originalHeight;

 #endregion

 #region Gravity.
 isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);
 if(isGrounded && velocity.y < 0)
 {
 velocity.y = 0f;
 }
 velocity.y += gravity * Time.deltaTime;
 controller.Move(velocity * Time.deltaTime);
 #endregion

 #region Jump.

 //Z�plama
 if (Input.GetButtonDown("Jump") && isGrounded)
 {
 velocity.y = Mathf.Sqrt(jumpHeight * -5f * gravity);
 }

 #endregion
 }

}
 
Son düzenleyen: Moderatör:
Unityde çok tecrübem yok gamemaker geliştiricisiyim ama yerçekimi değerinden olabilir. Yerçekimi değişkeni tanımlamış mıydınız ya da built in var mı?

if (Input.GetButtonDown("Jump") and isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -10f * gravity);
}

Bunu deneyin.

Grouncheck galiba collision gibi bir şey. O yüzden şunu önerebilirim. groundcheck en aşağıdaysa ve distance değeri buna göre az kalırsa karakter hemen yere düşer tahminimce. Ama sizinki gibi ortadaysa zıpladıktan sonra o kısım yere daha uzak kalacak ve karakterin düşmesi daha çok sürecek. grounddistance arttırıp deneyebilirsiniz bunu.

Yerçekimini de arttırın. Belki karakter düşüyordur ama yerçekimi çok az olduğundan fark etmiyorsunuzdur.
 
Son düzenleme:
Unity'de çok tecrübem yok gamemaker geliştiricisiyim ama yer çekimi değerinden olabilir. Yer çekimi değişkeni tanımlamış mıydınız ya da built in var mı?

İf (ınput. Getbuttondown("jump") and isgrounded)
{
Velocity. Y = mathf. Sqrt(jumpheight * -10F * gravity);
}

Bunu deneyin.

Grouncheck galiba collision gibi bir şey. O yüzden şunu önerebilirim. Groundcheck en aşağıdaysa ve distance değeri buna göre az kalırsa karakter hemen yere düşer tahminimce. Ama sizinki gibi ortadaysa zıpladıktan sonra o kısım yere daha uzak kalacak ve karakterin düşmesi daha çok sürecek. Grounddistance arttırıp deneyebilirsiniz bunu.

Yerçekimini de arttırın. Belki karakter düşüyordur ama yer çekimi çok az olduğundan fark etmiyorsunuzdur.

Dene dediğin kod hata veriyor. Ve grounddistance arttır demiştiniz ama ayarla oynadım arttırınca daha geç düşüyor azaltınca tam yerde duruyor. Teşekkürler.
 

Technopat Haberler

Geri
Yukarı