Koddaki hata nedir?

23Oesadn

Picopat
Katılım
3 Kasım 2024
Mesajlar
218
Daha fazla  
Cinsiyet
Erkek
Merhaba, ben şuan sadece unityi daha iyi kavramak için bir proje yapıyorum ve projemde hiç denemediğim bir şeyi yaptım. Bu şey de alana girince bütün karakter animasyonlarının durup hepsinin bana bakması ama bunu 50 kere farklı şekilde yazmama rağmen olmadı yapamadım.
Adımlarım:
Hierarchy'de sağ tık creat empty yaptım ve içine bu kodu yazdım.
C#:
using UnityEngine;
using System.Collections;

public class DüğünDurma : MonoBehaviour
{
    public Animator[] animators;
    public float rotationSpeed = 5f;

    void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            foreach (Animator anim in animators)
            {
                anim.speed = 0;

           
            LookAtPlayer();
        }
    }

    void LookAtPlayer()
    {
        Transform playerTransform = GameObject.FindWithTag("Player").transform;

        foreach (Animator anim in animators)
        {
            StartCoroutine(RotateToFace(anim.transform, playerTransform));
        }
    }

    IEnumerator RotateToFace(Transform character, Transform player)
    {
       
        while (Quaternion.Angle(character.rotation, player.rotation) > 0.1f)
        {
            character.rotation = Quaternion.Slerp(character.rotation, player.rotation, rotationSpeed * Time.deltaTime);
            yield return null;
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Player"))
        {
            foreach (Animator anim in animators)
            {
                anim.speed = 1;
            }
        }
    }
}
Sonra box collider ekleyip Is Trigger'ı işaretledim ve konumunu ayarladım.
İlk başta hiç biri durmadı ama animasyonlarımın loop timesini kapattığımda birinin durduğunu diğerinin durmadığını gördüm. Ne yapabilirim hiç bilmiyorum.
 
Süslü parantez olmuyor mu kodlarda.

GPT'ye sordum bunları verdi​

🚩 sorunlar:​


  1. animasyonun durmaması:anim. Speed = 0; animasyonu durdurur ama sadece o an oynuyorsa. Eğer animasyonun Loop'u kapalıysa ve bitmişse, zaten durmuştur. Bazı animasyonlar zaten son pozisyonuna gelip durmuş olabilir. Bu yüzden farklı davranıyor olabilirler.
  2. dönme yönü yanlış:kodda character. Rotation = quaternion. Slerp(character. Rotation, Player. Rotation...) Yapıyorsun ama burada karakterin direkt oyuncunun rotation'ına dönmesini değil, oyuncuya bakacak şekilde dönmesini istiyoruz.
  3. lookatplayer fonksiyonu tetiklenmiyor olabilir:LookAtPlayer() çağrısı foreach döngüsünün içinde, bu yüzden sadece ilk karakter için çağrılıyor olabilir.

Using unityengine;
Using System. Collections;

Public class düğündurma: Monobehaviour.
{
Public animator[] animators;
Public float rotationspeed = 5F;
Private bool hastriggered = false;

Void ontriggerenter(collider other)
{
İf (!hastriggered && other.comparetag("Player"))
{
Hastriggered = true;

Foreach (animator anim in animators)
{
Anim. Speed = 0;
}

LookAtPlayer();
}
}

Void LookAtPlayer()
{
Transform playertransform = gameobject. Findwithtag("Player").transform;

Foreach (animator anim in animators)
{
Startcoroutine(rotatetoface(anim. Transform, playertransform));
}
}

Ienumerator rotatetoface(transform character, transform Player)
{
Vector3 direction = (Player. Position - character. Position).normalized;
Direction. Y = 0F; // yükseklik farkını yok saymak için.

Quaternion lookrotation = quaternion. Lookrotation(direction);

While (quaternion. Angle(character. Rotation, lookrotation) > 0.1F)
{
Character. Rotation = quaternion. Slerp(character. Rotation, lookrotation, rotationspeed * time. Deltatime);
Yield return null;
}
}

Void ontriggerexit(collider other)
{
İf (other.comparetag("Player"))
{
Hastriggered = false;

Foreach (animator anim in animators)
{
Anim. Speed = 1;
}
}
}
}

ekstra kontroller:​


  • animator'ların hepsi doğru şekilde atanmış mı? empty Gameobject'e bu Script'i attıktan sonra animators dizisine Inspector'dan tüm karakterlerin animator Component'larını sürükleyip bırakman gerekiyor.
  • box Collider'ın ıs trigger kutusu işaretli mi?
  • Player nesnesinin Tag'i gerçekten Player mı?

Kanka yapay zeka cevapları olmamalı forumda.
Lütfen düzelt.
 

GPT'ye sordum bunları verdi​

🚩 sorunlar:​


  1. animasyonun durmaması:anim. Speed = 0; animasyonu durdurur ama sadece o an oynuyorsa. Eğer animasyonun Loop'u kapalıysa ve bitmişse, zaten durmuştur. Bazı animasyonlar zaten son pozisyonuna gelip durmuş olabilir. Bu yüzden farklı davranıyor olabilirler.
  2. dönme yönü yanlış:kodda character. Rotation = quaternion. Slerp(character. Rotation, Player. Rotation...) Yapıyorsun ama burada karakterin direkt oyuncunun rotation'ına dönmesini değil, oyuncuya bakacak şekilde dönmesini istiyoruz.
  3. lookatplayer fonksiyonu tetiklenmiyor olabilir:LookAtPlayer() çağrısı foreach döngüsünün içinde, bu yüzden sadece ilk karakter için çağrılıyor olabilir.

C#:
using UnityEngine;
using System.Collections;

public class DüğünDurma : MonoBehaviour.
{
 public Animator[] animators;
 public float rotationSpeed = 5f;
 private bool hasTriggered = false;

 void OnTriggerEnter(Collider other)
 {
 if (!hasTriggered && other.CompareTag("Player"))
 {
 hasTriggered = true;

 foreach (Animator anim in animators)
 {
 anim.speed = 0;
 }

 LookAtPlayer();
 }
 }

 void LookAtPlayer()
 {
 Transform playerTransform = GameObject.FindWithTag("Player").transform;

 foreach (Animator anim in animators)
 {
 StartCoroutine(RotateToFace(anim.transform, playerTransform));
 }
 }

 IEnumerator RotateToFace(Transform character, Transform player)
 {
 Vector3 direction = (player.position - character.position).normalized;
 direction.y = 0f; // Yükseklik farkını yok saymak için.

 Quaternion lookRotation = Quaternion.LookRotation(direction);

 while (Quaternion.Angle(character.rotation, lookRotation) > 0.1f)
 {
 character.rotation = Quaternion.Slerp(character.rotation, lookRotation, rotationSpeed * Time.deltaTime);
 yield return null;
 }
 }

 void OnTriggerExit(Collider other)
 {
 if (other.CompareTag("Player"))
 {
 hasTriggered = false;

 foreach (Animator anim in animators)
 {
 anim.speed = 1;
 }
 }
 }
}

ekstra kontroller:​


  • animator'ların hepsi doğru şekilde atanmış mı? empty Gameobject'e bu Script'i attıktan sonra animators dizisine Inspector'dan tüm karakterlerin animator Component'larını sürükleyip bırakman gerekiyor.
  • box Collider'ın ıs trigger kutusu işaretli mi?
  • Player nesnesinin Tag'i gerçekten Player mı?

Bu olmadı ne yazık ki.
 
Adam yardım etmeye çalışmış, okuduğum Technopat kurallarında böyle şeyler yoktu.
public class DüğünDurma : MonoBehaviour
{
public Animator[] animators;
public float rotationSpeed = 5f;

void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
foreach (Animator anim in animators)
{
anim.speed = 0;
}

LookAtPlayer();
}
}

void LookAtPlayer()
{
Transform playerTransform = GameObject.FindWithTag("Player").transform;

foreach (Animator anim in animators)
{
StartCoroutine(RotateToFace(anim.transform, playerTransform));
}
}

IEnumerator RotateToFace(Transform character, Transform player)
{
while (Quaternion.Angle(character.rotation, player.rotation) > 0.1f)
{
character.rotation = Quaternion.Slerp(character.rotation, player.rotation, rotationSpeed * Time.deltaTime);
yield return null;
}
}

void OnTriggerExit(Collider other)
{
if (other.CompareTag("Player"))
{
foreach (Animator anim in animators)
{
anim.speed = 1;
}
}
}
}
 
Public class düğündurma: Monobehaviour.
{
Public animator[] animators;
Public float rotationspeed = 5F;

Void ontriggerenter(collider other)
{
İf (other.comparetag("Player"))
{
Foreach (animator anim in animators)
{
Anim. Speed = 0;
}

LookAtPlayer();
}
}

Void LookAtPlayer()
{
Transform playertransform = gameobject. Findwithtag("Player").transform;

Foreach (animator anim in animators)
{
Startcoroutine(rotatetoface(anim. Transform, playertransform));
}
}

Ienumerator rotatetoface(transform character, transform Player)
{
While (quaternion. Angle(character. Rotation, Player. Rotation) > 0.1F)
{
Character. Rotation = quaternion. Slerp(character. Rotation, Player. Rotation, rotationspeed * time. Deltatime);
Yield return null;
}
}

Void ontriggerexit(collider other)
{
İf (other.comparetag("Player"))
{
Foreach (animator anim in animators)
{
Anim. Speed = 1;
}
}
}
}

Assets\Çakmaduvar.cs(31,5): error CS0246: The type or namespace name 'ıenumerator' could not be found (are you missing a using directive or an Assembly reference?)
Böyle hata var.
 

Technopat Haberler

Geri
Yukarı