Platforma Bin
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 51 / 60.
Bir CharacterController, üzerinde durduğu şey tarafından taşınmaz: hareketli bir platformda olduğu yerde kalır ve platform altından kayıp gider. transform.position değerini değiştirmek işe yaramaz; çünkü sonraki Move, fiziğin onu en son gördüğü konumdan başlar ve değişikliği geri alır.
Bu yüzden oyuncu, platformun hareketini kendi hareketine ekler. OnControllerColliderHit(ControllerColliderHit hit), Move işleminin temas ettiği her çarpıştırıcı için çalışır; alttan gelen bir çarpışmada hit.normal.y değeri 1'e yakındır. Bir kasayı aynı şekilde taşıyan bir feribot:
private Ferry ferry;
void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.normal.y > 0.7f && hit.gameObject.TryGetComponent(out Ferry f))
{
ferry = f;
}
}Görev
OrtaOyuncunun hareketli platforma binmesini sağla.
Playeriçindeprivate MovingPlatform platform;veOnControllerColliderHitekle:hit.normal.y > 0.5folduğunda ve nesnede birMovingPlatformbulunduğunda, onuplatformiçinde tut.Update()içinde(move + velocity) * Time.deltaTimeifadesiniVector3 motioniçine koy.platform != nulliseplatform.deltaekle veplatform = nullolarak ayarla.controller.Move(motion)çağrısını yap.
“Oyna” düğmesine bas ve platformun üzerine zıpla: platform seni taşır. Ardından “Kontrol et”.
Kendin dene
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpHeight = 1.5f;
[SerializeField] private float gravity = -9.81f;
private CharacterController controller;
private InputAction moveAction;
private InputAction jumpAction;
private Vector3 velocity;
void Start()
{
controller = GetComponent<CharacterController>();
moveAction = InputSystem.actions.FindAction("Move");
jumpAction = InputSystem.actions.FindAction("Jump");
}
void Update()
{
if (controller.isGrounded && velocity.y < 0f)
{
velocity.y = -2f;
}
Vector2 input = moveAction.ReadValue<Vector2>();
Vector3 move = new Vector3(input.x, 0f, input.y) * speed;
if (jumpAction.WasPressedThisFrame() && controller.isGrounded)
{
velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
velocity.y += gravity * Time.deltaTime;
controller.Move((move + velocity) * Time.deltaTime);
}
}
Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi4Sahneler ve Bölümler
Bir Sahne YüklemeBölümü Yeniden BaşlatmaSonraki BölümSahneler Arasında SaklamaTekrar: Bölüm Seçimi10Proje: 3D Platform Oyunu
ParkurHareketli Platformlar2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki ParalarKendi başına pratik yap: Unity playground