Yumuşakça Dön
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 45 / 71.
transform.rotation değerini doğrudan yeni bir dönüşe ayarlamak, bir nesneyi tek karede döndürür. Quaternion.RotateTowards(current, goal, maxDegrees), current değerini goal yönünde en fazla maxDegrees kadar döndürülmüş hâliyle döndürür ve hedefi asla geçmez. Adım olarak turnSpeed * Time.deltaTime kullanıldığında nesne sabit bir hızla döner ve konumlar için MoveTowards'un yaptığı gibi tam hedefinde durur. Bu ayçiçeği, saniyede 30 derece hızla güneşi takip eder:
public Transform sun;
public float turnSpeed = 30f;
void Update()
{
Quaternion goal = Quaternion.LookRotation(sun.position - transform.position);
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);
}Ayçiçeğinin, 90 derece uzaktaki bir güneşe ulaşması 3 saniye sürer; her saniyede 30 derece döner. En kısa yönde döner ve hedef her karede yeniden hesaplandığından hareketli bir güneşi takip eder.
Quaternion.Slerp(a, b, t), Vector3.Lerp'un noktalar için yaptığı gibi, a ile b arasındaki yolun t oranındaki dönüşü verir. Update() içinde Slerp(transform.rotation, goal, 5f * Time.deltaTime) şeklinde yazıldığında her karede kalan açının bir kısmı kadar döner: başlangıçta hızlı, hedefe yaklaştıkça giderek yavaşlar; sabit bir hızda dönmez ve hedefe tam olarak ulaşmaz. Bu yumuşak geçiş, kamera veya dönen bir kafa için uygundur. Dönüş hızı oyunun bir kuralıysa (örneğin saniyede 60 derece dönen bir top gibi), RotateTowards kullanın.
Görev
OrtaBaykuşu, her okun gösterdiği yöne doğru yumuşakça döndür.
Quaternion goal;ekle veStart()içindetransform.rotationdeğerine ayarla.- Her ok için
Input.GetKeyDownolduğundagoaldeğerini ayarla. Örneğin:goal = Quaternion.LookRotation(Vector3.right);: yukarı +z, sağ +x, aşağı -z, sol -x. - Her karede
transform.rotation = Quaternion.RotateTowards(transform.rotation, goal, turnSpeed * Time.deltaTime);satırını ayarla.
“Oyna” düğmesine bas ve oklara dokun. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class Owl : MonoBehaviour
{
public float turnSpeed = 180f;
void Update()
{
// Yukarı, sağ, aşağı, sol: saniyede turnSpeed derece hızla sırasıyla +z, +x, -z, -x yönlerine dön.
}
}
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir DuvarKendi başına pratik yap: Unity playground