Çözüldü Unity'de karakterin yönlendirmesi nasıl kısıtlanır?

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Mustafaa1

Centipat
Katılım
29 Nisan 2022
Mesajlar
109
Çözümler
4
Daha fazla  
Cinsiyet
Erkek
Basit bir ateş etme oyunu yaptım. Space tuşuna basınca kutucukları vuruyoruz. Bizim oynadığımız karakter sağa sola yukarı aşağıya dönebiliyor. Ben sınırlama getirmek istiyorum mesela X yönünde -45 ile +45 arasında bir değer alsın daha fazla dönmesin nasıl bir kod yazmalıyım? Eğer yardımcı olursanız çok mutlu olurum.
 
Basit bir ateş etme oyunu yaptım. Space tuşuna basınca kutucukları vuruyoruz. Bizim oynadığımız karakter sağa sola yukarı aşağıya dönebiliyor. Ben sınırlama getirmek istiyorum mesela X yönünde -45 ile +45 arasında bir değer alsın daha fazla dönmesin nasıl bir kod yazmalıyım? Eğer yardımcı olursanız çok mutlu olurum.
Mathf.Clamp() fonksiyonu ile her döndüğünde kontrol ederek kısıtlayabilirsiniz. Yani x karakterin x rotasyonu olarak kabul edilirse şu şekilde:
x = Mathf.Clamp(x, -45f, 45f)
 
if (Input.GetButton("Horizontal"))
{
oyuncu.Rotate(0, Input.GetAxisRaw("Horizontal"), 0);
// float ypozisyon = Mathf.Clamp(oyuncu.transform.rotation.y,-40,40);
//oyuncu.transform.rotation = Quaternion.Euler(oyuncu.transform.rotation.x,ypozisyon,oyuncu.transform.rotation.z);
}
if (Input.GetButton("Vertical"))
{
namlu.Rotate(Input.GetAxisRaw("Vertical"), 0, 0);
// float xpozisyon = Mathf.Clamp(namlu.rotation.x, -20, 20);
// namlu.transform.rotation = Quaternion.Euler(xpozisyon, namlu.transform.rotation.y,namlu.transform.rotation.z);
}
//Normal şartlarda kodum çalışıyordu mathf.clamp'i ekledikten sonra dönme hareketini yapmıyor.Yeni eklediklerimi yorum satırı yaptım.
 
if (Input.GetButton("Horizontal"))
{
oyuncu.Rotate(0, Input.GetAxisRaw("Horizontal"), 0);
// float ypozisyon = Mathf.Clamp(oyuncu.transform.rotation.y,-40,40);
//oyuncu.transform.rotation = Quaternion.Euler(oyuncu.transform.rotation.x,ypozisyon,oyuncu.transform.rotation.z);
}
if (Input.GetButton("Vertical"))
{
namlu.Rotate(Input.GetAxisRaw("Vertical"), 0, 0);
// float xpozisyon = Mathf.Clamp(namlu.rotation.x, -20, 20);
// namlu.transform.rotation = Quaternion.Euler(xpozisyon, namlu.transform.rotation.y,namlu.transform.rotation.z);
}
//Normal şartlarda kodum çalışıyordu mathf.clamp'i ekledikten sonra dönme hareketini yapmıyor.Yeni eklediklerimi yorum satırı yaptım.
Hata var.
Siz önce clampleyip sonra işlem yapmışsınız. Şunu CHLook isimli bir script oluşturup içine yazın ve geçerli karaktere atın:
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CHLook : MonoBehaviour
{
    public int rotatevalue = 2;
    float xrotation = 0f;
    Transform tf;

    float XRotator(float rot, float min, float max)
    {
        float getrotatex = rot;
        if(Input.GetKey(KeyCode.W))
        {
            getrotatex += rotatevalue;
        }
        else if(Input.GetKey(KeyCode.S))
        {
            getrotatex -= rotatevalue;
        }

        return Mathf.Clamp(getrotatex, min, max);
    }

    void Start()
    {
        tf = GetComponent<Transform>();
    }

    void Update()
    {
        xrotation = XRotator(xrotation, -20f, 20f);
        tf.rotation = Quaternion.Euler(xrotation, tf.rotation.y, tf.rotation.z);
    }
}
Şuan w ve s ile x rotasyonunu değiştirebilirsiniz.
 
Son düzenleme:
Hata var.
Siz önce clampleyip sonra işlem yapmışsınız. Şunu CHLook isimli bir script oluşturup içine yazın ve geçerli karaktere atın:
C#:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CHLook : MonoBehaviour
{
    public int rotatevalue = 2;
    float xrotation = 0f;
    Transform tf;

    float XRotator(float rot, float min, float max)
    {
        float getrotatex = rot;
        if(Input.GetKey(KeyCode.W))
        {
            getrotatex += rotatevalue;
        }
        else if(Input.GetKey(KeyCode.S))
        {
            getrotatex -= rotatevalue;
        }

        return Mathf.Clamp(getrotatex, min, max);
    }

    void Start()
    {
        tf = GetComponent<Transform>();
    }

    void Update()
    {
        xrotation = XRotator(xrotation, -20f, 20f);
        tf.rotation = Quaternion.Euler(xrotation, tf.rotation.y, tf.rotation.z);
    }
}
Şuan w ve s ile x rotasyonunu değiştirebilirsiniz.
Hocam vaktinizi ayırıp ilgilendiğiniz için çok teşekkür ederim ama hala istediğim gibi sonuca ulaşamadım.İlk kendi yazmış olduğum kodda dönüşlerde herhangi bir problem yaşamıyordum.Sadece sınırlama sıkıntım vardı.Ama sizin vermiş olduğunuz kodu aynen şu şekilde yazdım.

float xrotator(float rot,float min ,float max)
{
float getrotatex = rot;
if(Input.GetKey(KeyCode.S))
{
getrotatex += rotatevalue;
}
else if (Input.GetKey(KeyCode.W))
{
getrotatex -= rotatevalue;
}
return Mathf.Clamp(getrotatex,min,max);
}

float yrotator(float rot, float min, float max)
{
float getrotatey = rot;
if (Input.GetKey(KeyCode.A))
{
getrotatey += rotatevalue;
}
else if (Input.GetKey(KeyCode.D))
{
getrotatey -= rotatevalue;
}
return Mathf.Clamp(getrotatey, min, max);
}
void Update()
{
Xrotation = xrotator(Xrotation,-20f,20f);
Yrotation = yrotator(Yrotation, -40f, 40f);
namlu.rotation = Quaternion.Euler(Xrotation,namlu.rotation.y,namlu.rotation.z);
oyuncu.rotation = Quaternion.Euler(oyuncu.rotation.x,Yrotation, oyuncu.rotation.z);
}
Bu kod ile dönüşlerde şöyle bi sıkıntım var.
Oyuncu objem sağa ve sola hareket edicek ama namlu objem bu hareketlerden etkilenmeyecek.Oda sadece yukarı ve aşağı hareket edicek.Yukarı ve aşağı sorunsuz çalışıyor ama sağa sola dönünce namluda kendi sağa ve sola dönüyor.Dün yazmış olduğunuz kodu defalarca inceledim neden iki obje birden dönüyo diye ama bulamadım.Sizce neden ikiside dönüyor olabilir?
 
Onda da aynı problem olmalıydı. Sonuçta namlu karakterin transformuna bağlı. Yani namlu 0 noktası olarak karakteri baz alıyor.
Tamamdır hocam hallettim.
namlu.rotation = Quaternion.Euler(Xrotation,Yrotation,0);
oyuncu.rotation = Quaternion.Euler(0,Yrotation, 0);
Böyle yazdığım zaman ilk kodumun halini aldı.
Çok sağolun hocam.
 
Son düzenleme:

Geri
Yukarı