Hocam bir örnek verir misiniz?İnterfaceler de var IPointerClickHandler gibi. Hepsini denemek lazım.
RayCast ile yapayım ama her objenin bir scriptine/componentine erişmem gerekiyor. Ondan performansı sorunu oluşturmaz mı bu yöntem?Raycast ile yapılması en mantıklı ama bunu obje içinde değil de oltanin olduğu scriptten çağır
Ray kodunu yazarken de ilk başa onMouseButtonDown şartını koyarsan optimizasyon sorunu olmaz.
Yanlış anladıysam düzeltin beni lütfenRayCast ile yapayım ama her objenin bir scriptine/componentine erişmem gerekiyor. Ondan performansı sorunu oluşturmaz mı bu yöntem?
Oyunumda olta yoktur. Her balığın kendi scripti vardır.
Hocam ben direkt balığın kodunu atayım. OnMouseDown ile yapmıştım;Yanlış anladıysam düzeltin beni lütfen
Mouse ile balığa tıkandığı zaman tıklaman balığın üzerindeki x değişkeninin değeri 0 olacak
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;
using TMPro;
public class FishMove : MonoBehaviour
{
// Finish location
Vector2 finish;
// Fish Specs;
[SerializeField] FishScript fishScript;
// Bubble
[SerializeField] ParticleSystem bubbleRef;
ParticleSystem bubble;
// Point
[SerializeField] GameObject pointRef;
GameObject pointObject;
TextMeshPro pointText;
bool pointIsActive;
bool addPoint;
int point = 0;
Vector2 scoreLocation;
float pointSpeed = 7f;
// Speed
float speed = 0f;
// Start is called before the first frame update
void Start()
{
// Set Bubble
bubble = Instantiate(bubbleRef);
// Set Point
pointObject = Instantiate(pointRef);
point = fishScript.point;
pointText = pointObject.GetComponent<TextMeshPro>();
scoreLocation = ScoreManager.INSTANCE.scoreText.transform.position;
Init();
}
// Update is called once per frame
void Update()
{
if (pointIsActive)
{
if (Vector2.Distance(pointObject.transform.position, scoreLocation) != 0f)
{
pointObject.transform.position = Vector2.MoveTowards(pointObject.transform.position,
scoreLocation, pointSpeed * Time.deltaTime);
}
else
{
if(addPoint){
ScoreManager.INSTANCE.AddPoint(point);
pointText.text = "";
addPoint = false;
}
if(!bubble.isPlaying){
sendPool();
}
}
}
else
{
if (Vector2.Distance(transform.position, finish) != 0f)
{
transform.position = Vector2.MoveTowards(transform.position,
finish, speed * Time.deltaTime);
}
else
{
sendPool();
}
}
}
void Init()
{
transform.position = FishInit.INSTANCE.setLocation();
finish = FishInit.INSTANCE.setFinishLocation(gameObject);
transform.localScale = new Vector3(1, 1, 1);
if (transform.position.x > 0)
{
transform.localScale = new Vector3(-1, 1, 1);
}
speed = fishScript.speed;
// Point
pointObject.transform.position = transform.position;
pointObject.SetActive(false);
pointIsActive = pointObject.activeInHierarchy;
addPoint = true;
pointText.text = $"{point}";
// Bubble
bubble.transform.position = transform.position;
}
void OnMouseDown()
{
bubble.Play();
pointObject.SetActive(true);
pointIsActive = pointObject.activeInHierarchy;
pointObject.transform.position = transform.position;
bubble.transform.position = transform.position;
transform.position = new Vector2(100, 100);
//sendPool();
}
void sendPool()
{
Init();
FishManager.INSTANCE.fishRemoveScene(gameObject);
}
}
Burada onmusedown fonksiyonunu kullanıyorsunuz. Bu fonksiyon birbirine çok yakın objelerde çok sağlıklı çalışmıyor bu yüzden bu fonksiyonla yapmak çok sağlıklı olmayacaktır. Bunun yerine oltadan ray atarak yapmak daha mantıklı olur.Hocam ben direkt balığın kodunu atayım. OnMouseDown ile yapmıştım;
C#:using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using TMPro; public class FishMove : MonoBehaviour { // Finish location Vector2 finish; // Fish Specs; [SerializeField] FishScript fishScript; // Bubble [SerializeField] ParticleSystem bubbleRef; ParticleSystem bubble; // Point [SerializeField] GameObject pointRef; GameObject pointObject; TextMeshPro pointText; bool pointIsActive; bool addPoint; int point = 0; Vector2 scoreLocation; float pointSpeed = 7f; // Speed float speed = 0f; // Start is called before the first frame update void Start() { // Set Bubble bubble = Instantiate(bubbleRef); // Set Point pointObject = Instantiate(pointRef); point = fishScript.point; pointText = pointObject.GetComponent<TextMeshPro>(); scoreLocation = ScoreManager.INSTANCE.scoreText.transform.position; Init(); } // Update is called once per frame void Update() { if (pointIsActive) { if (Vector2.Distance(pointObject.transform.position, scoreLocation) != 0f) { pointObject.transform.position = Vector2.MoveTowards(pointObject.transform.position, scoreLocation, pointSpeed * Time.deltaTime); } else { if(addPoint){ ScoreManager.INSTANCE.AddPoint(point); pointText.text = ""; addPoint = false; } if(!bubble.isPlaying){ sendPool(); } } } else { if (Vector2.Distance(transform.position, finish) != 0f) { transform.position = Vector2.MoveTowards(transform.position, finish, speed * Time.deltaTime); } else { sendPool(); } } } void Init() { transform.position = FishInit.INSTANCE.setLocation(); finish = FishInit.INSTANCE.setFinishLocation(gameObject); transform.localScale = new Vector3(1, 1, 1); if (transform.position.x > 0) { transform.localScale = new Vector3(-1, 1, 1); } speed = fishScript.speed; // Point pointObject.transform.position = transform.position; pointObject.SetActive(false); pointIsActive = pointObject.activeInHierarchy; addPoint = true; pointText.text = $"{point}"; // Bubble bubble.transform.position = transform.position; } void OnMouseDown() { bubble.Play(); pointObject.SetActive(true); pointIsActive = pointObject.activeInHierarchy; pointObject.transform.position = transform.position; bubble.transform.position = transform.position; transform.position = new Vector2(100, 100); //sendPool(); } void sendPool() { Init(); FishManager.INSTANCE.fishRemoveScene(gameObject); } }
Kodun işlevi, balığa tıkladığımız zaman onu bir noktaya gönderiyor. Referans aldığı puan ve balon nesnelerinin de işlevleri bitince, balığı tekrar ayarlıyor ve havuza geri gönderiyor.
Hocam birde oyunum 2D olacaktır. Bu raycast fonksiyonlarını tek bir InputManager sınıfı yapıp oradan yapayım ama nesnelerin scriptine erişmek performans kaybı yaratır mı?Burada onmusedown fonksiyonunu kullanıyorsunuz. Bu fonksiyon birbirine çok yakın objelerde çok sağlıklı çalışmıyor bu yüzden bu fonksiyonla yapmak çok sağlıklı olmayacaktır. Bunun yerine oltadan ray atarak yapmak daha mantıklı olur.
Şu an telefonda olduğum için düzgün yazamıyorum ama size yapmanız kodu tarif edeyim
İlk önce fish move scripti üzerindeki move down fonksiyonunun adını değistirin adi ClickedToFish olsun mesela
Sonrasında olta script üzerinde update kısmına
If (on mouse button down (0) & raycast (out hit)
{
Hit.transform.getcomponent<fishmove>().ClickedToFish()
}
Eğer o sırada tiklanan balığın altındaki diğer balıklarin da bu fonksiyonu çalışsın istiyorsaniz raycastall kullanın. Veya daha kalabalık bir alanı alsın isterseniz spherecast de kullanabilirsiniz
Hocam 2d hiç proje geliştirmedimHocam birde oyunum 2D olacaktır. Bu raycast fonksiyonlarını tek bir InputManager sınıfı yapıp oradan yapayım ama nesnelerin scriptine erişmek performans kaybı yaratır mı?
Siz bir ara işiniz olmaz ise yazarsanız çok makbule geçer. Ne zaman boş olursanız, detaylıca anlatmak isterseniz buradayım.