공부/Unity

[unity]canvas 위에 보이는 클릭/터치 이펙트 구현 - 2

개발의 피 2024. 5. 27. 18:36

유튜브 영상을 보고 따라하면, 나오는 결과

 

파란색 배경은, 카메라 - solid color고 Canvas를 만들고, UI 이미지(흰색을 추가하면)

하이러라키 창에 Clone으로 이펙트 프리팹이 생성되는 건 보이지만.. 이미지에 가려져서 보이지 않는다 

 

영상보고 따라한 코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TouchEffect : MonoBehaviour
{
    public GameObject effectPrefab;

    private float spawnTime;
    public float zOffset = 15f;
    public float defaultTime = 0.05f;
    public float effectLifeTime = 2f;

    void Update()
    {
        spawnTime += Time.deltaTime;
        
        if (Input.GetMouseButton(0) && spawnTime >= defaultTime)
        {
            CreateEffect();
            spawnTime = 0;
        }
    }

    void CreateEffect()
    {
        Vector3 mousePosition = Input.mousePosition;
        mousePosition.z = zOffset; // 카메라 조정
        
        Vector3 worldPosition = Camera.main.ScreenToWorldPoint(mousePosition);
        worldPosition.z = 0;

        Debug.Log($"Screen Position: {mousePosition}, World Position: {worldPosition}, Camera Position: {Camera.main.transform.position}");
        
        //Instantiate(effectPrefab, worldPosition, Quaternion.identity);
        GameObject effectInstance = Instantiate(effectPrefab, worldPosition, Quaternion.identity);

        Destroy(effectInstance, effectLifeTime);
    }
}

 

 

 

그러면 Canvas에 프리팹이 생성되게 하면 되지 않아? 라고 생각했고, 이게 해결 방법이 맞았지만 또 다른 문제점이 있었다 

Canvas에서 생성되게 하려면 RectTransform이 필요....! 

 

https://discussions.unity.com/t/how-to-convert-touch-position-to-canvas-position/216237/3

코드를 참조해서 수정했다 

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ImageEffect : MonoBehaviour
{
    //public GameObject squarePrefab;
    public GameObject particlePrefab;
    private float spawnsTime;
    public float defaultTime = 0.05f;
    public float effectLifeTime = 2f;
    
    public Canvas canvas;
    
    void Update()
    {
        if (Input.GetMouseButton(0) && spawnsTime >= defaultTime)
        {
            StarCreate();
            spawnsTime = 0;
        }

        spawnsTime += Time.deltaTime;
    }

    void StarCreate()
    {
        
        // Get the mouse position in screen space
        Vector3 mousePosition = Input.mousePosition;

        // Instantiate the UI element as a child of the Canvas
        GameObject uiElement = Instantiate(particlePrefab, canvas.transform);

        // Convert screen space to Canvas space
        RectTransformUtility.ScreenPointToLocalPointInRectangle(canvas.transform as RectTransform, mousePosition, canvas.worldCamera, out Vector2 localPoint);

        // Set the UI element's position
        RectTransform rectTransform = uiElement.GetComponent<RectTransform>();
        rectTransform.localPosition = localPoint;

        Debug.Log("Mouse Position: " + Input.mousePosition + " Local Position: " + localPoint);
    }
}

파티클을 사용할 수 없는 건, 이전과 마찬가지지만

캔버스에 자식으로 생성돼서 이미지 위에도 뜰 수 있게 되었다!