Çözüldü Unity Obje Alma Kodu çalışmıyor

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

900

Hectopat
Katılım
24 Kasım 2020
Mesajlar
1.040
Makaleler
6
C#:
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using JetBrains.Annotations;
using Unity.Mathematics;
using UnityEngine;
using UnityEngine.UIElements;

using Vector3 = UnityEngine.Vector3;
using Vector2 = UnityEngine.Vector2;
using Quaternion = UnityEngine.Quaternion;
// Şu üçü VSCode içinde kullanırken System.Numerics ve UnityEngine arasında ayrım belirtmememe dair verdiği hatalar için

public class Movement : MonoBehaviour
{
 [SerializeField] public float movSpeed = 10f;
 [SerializeField] public float pickUpRange = 10f;
 public GameObject currentlyCarriedObject;
 public LayerMask interactObjectLayerMask;
 [SerializeField]GameObject playerSprite;
 [SerializeField]GameObject holdPosition;
 public Vector2 direction;
 void Start()
 {
 Physics2D.queriesStartInColliders = false; // raycastin içinden çıktığı karakterin kendi collision box'ını vurmasını engelleyen ayar
 // kod içinde kullanılan bazı oyun objelerini eğer editörden ayarlamamışsam isimleri üzerinden elle bulmakla ilgili niye eklediğimi bilmediğim bir kısım
 if (playerSprite == null)
 playerSprite = GameObject.FindWithTag("P_Sprite");
 if (holdPosition == null)
 holdPosition = GameObject.Find("HoldPos");
 }
 void Update()
 {
 Move();
 Debug.DrawRay(transform.position, direction, Color.red, 10f); // Bunu da düzgün çizdiremedim raycastin nasıl çalıştığını çok iyi anlamamış olabilirim
 if (Input.GetKeyDown(KeyCode.E))
 {
 PickUpObjects();
 }
 }
 void Move() // bu kısım zaten basit bir kontrolcü açıklayacak çok bir şeyi yok
 {
 direction = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized;
 if (direction != Vector2.zero)
 {
 transform.Translate(direction * movSpeed * Time.deltaTime);
 float angle = Mathf.Atan2(direction[1], direction[0]) * Mathf.Rad2Deg;
 playerSprite.transform.rotation = Quaternion.Euler(0,0,angle);
 }
 print(direction);
 }
 void PickUpObjects()
 {
 RaycastHit2D hit_obj = Physics2D.Raycast(transform.position, direction, pickUpRange, interactObjectLayerMask); // 2d raycast doğru ayarladığımı düşünüyorum
 if (currentlyCarriedObject == null) // oyuncunun halihazırda birşeyler taşıyıp taşımadına dair kontrol
 {
 if (hit_obj.collider != null && hit_obj.collider.CompareTag("BoxTag")) //raycastin bir şey bulup bulmadığının ve objenin istenen etikete sahip olduğunun kontrolü
 {
 GameObject carriedObject = hit_obj.collider.gameObject; // raycastin bulduğu objeyi bir değişkene ata
 currentlyCarriedObject = carriedObject; // değişkene atanan objeyi halihazırda taşınan obje için ayrılan değişkene (currentlyCarriedObject) ata
 currentlyCarriedObject.transform.SetParent(playerSprite.transform); // objeyi oyuncunun çocuğu olan görselin (sprite) çocuğu yap
 currentlyCarriedObject.transform.position = holdPosition.transform.position; // objeyi editörde oyuncunun taşıdığı obje için ayarlanmış yere taşı
 }
 }
 else if (currentlyCarriedObject != null) // oyuncu yeni obje almaya çalışıyorsa elindeki mevcut objeyi bırak ve currentlyCarriedObject değişkenini boşalt
 {
 currentlyCarriedObject.transform.SetParent(null);
 currentlyCarriedObject = null;
 }
 }
}

Burada yukarıdan görünümlü 2 boyutlu boş bir Unity projesinde öylesine bir şeyler kodlamaya çalışıyordum. Yapmaya çalıştığım şey başlangıçta kutuları alıp hareket edebildiğimiz basit bir kontrolcü ayarlamak daha sonra o kutuları üzerine koyabileceğimiz butonlar falan da eklemeyi düşünüyordum da burada takıldım.

Karakterin hareketinde bir sıkıntı yok ama almasını istediğim objeleri almıyor. Raycasti yanlış mı kullanıyorum bilmiyorum ama sorunu kendim bulamadım. Kodun her bir kısmının ne yaptığını yanına eklerim.

Ayrıca karakter ve ona bağlı alt düğümler editörde Player onun altında P_Sprite onun da altında HoldPos şeklinde ayarlı.
 
Son düzenleyen: Moderatör:
Çözüm
...
private Vector2 = lastDirection;
...


if (direction != Vector2.zero)
{
lastDirection = direction;
transform.Translate(direction * movSpeed * Time.deltaTime);
float angle = Mathf.Atan2(direction[1], direction[0]) * Mathf.Rad2Deg;
playerSprite.transform.rotation = Quaternion.Euler(0,0,angle);
}

...


RaycastHit2D hit_obj = Physics2D.Raycast(transform.position, lastDirection, pickUpRange, interactObjectLayerMask); // 2d raycast doğru ayarladığımı düşünüyorum


hareket etmediyinde direction sıfır oluyor, if(direction != Vector2.zero) da lastDirection saklayıp dene istersen
İflere breakpoint kullanıp içine giriyor mu diye kontrol edebilirsin, ayrıca hit_obj gibi değerler Debug Console'da boş mu dolu mu diye de bakabilirsin, Debug. DrawRay ile objeye çarpıp çarpmadığına da kontrol et
 
VSCode'da breakpointler yokmuş sanırım ama print kullanarak hangi if bloklarına girdiğine bakabildim, ikinci if bloğuna
C#:
hit_obj.collider != null
kısmı yüzünden girmiyor. Bir tane ray çiziyor ama istediğim gibi değil.
Sorun büyük ihtimalle yönü düzgün hesaplayamamamdan kaynaklı. Raycaste direction yerine Vector2.right yazıp doğru taraftan yaklaşsam çalışıyor çünkü. Şu andaki haliyle hem klavye kullanıyorum hem de GetAxisRaw() ile girdi aldığım için zaten 8 farklı yön var. Benim bilgisizliğimle alakalı muhtemelen ama aklıma raycastin yönünü direk oyuncunun yönü olarak atamaktan başka bir şey gelmiyor. Bunu E tuşuna basıldığında sadece bir karede yapmak veya oyuncunun yönünün (0,0) da olabileceği sorun olabilir gibi geliyor ama nasıl ayarlayacağımı bilmiyorum.

Debug.DrawRay()'e raycast ile aynı değerleri girip çizdirip dümdüz sola yürüyünce şöyle görüntüler oluşuyor:

Ekran görüntüsü 2024-04-10 180744.png
 
...
private Vector2 = lastDirection;
...


if (direction != Vector2.zero)
{
lastDirection = direction;
transform.Translate(direction * movSpeed * Time.deltaTime);
float angle = Mathf.Atan2(direction[1], direction[0]) * Mathf.Rad2Deg;
playerSprite.transform.rotation = Quaternion.Euler(0,0,angle);
}

...


RaycastHit2D hit_obj = Physics2D.Raycast(transform.position, lastDirection, pickUpRange, interactObjectLayerMask); // 2d raycast doğru ayarladığımı düşünüyorum


hareket etmediyinde direction sıfır oluyor, if(direction != Vector2.zero) da lastDirection saklayıp dene istersen
 
Çözüm

Yeni konular

Geri
Yukarı