두개의 GameObject를 하나로 합치기.
게임을 만들다 보면 다양하게 활용할 수 있다.
대략적인 순서는 아래로 보면 된다.
1. 본체1과 본체2 (동일한 물체)가 있음
- 본체1과 본체2에는 DragObject.cs
2. 본체1을 클릭하면 본체1의 dummy가 생성(MouseDown, MouseDrag)
- 본체1의 dummy에는 dummyDragObject.cs
3. 본체1의 dummy가 본체 2와 닿은 상태에 mergyReady가 True.
- 이때 RigidBody는 Trigger를 체크해야 함.
- OnTriggerEnter, OnTriggerStay, OnTriggerExit 이용하여 mergyReady의 상태 변화 필요.
4. mergyReady가 True인 상태에 MouseUp을 하면 본체1, 본체2, 본체1의 dummy는 사라지고, 새로운 GameObject 생성.

보통 mouseButtonReleased의 boolean을 많이 이용하는데, 나는 내가 필요한 기능에 맞춰서 변형.
1. DragObject.cs
OnMouseDown()을 이용해서, 처음에 클릭하면 본 물체는 가만히 있고 dummy가 생긴다.
타워디펜스의 경우, 합체한다고 본체가 움직이면 안되니까... 본체는 가만히 하던거 하고 새로운 dummy 를 생성한다.
dummy의 경우 본체를 복사해서 다른 기능은 다 지우고 색깔에 살짝 투명도를 넣어서 생성.
public class DragObject : MonoBehaviour
{
private Vector2 mousePosition;
public GameObject dummy;
DummyDragObject dummyDragObject;
private void OnMouseDown()
{
GameObject _dummy = (GameObject)Instantiate(turretSelf.dummy, transform.position, Quaternion.identity);
dummy = _dummy;
dummyDragObject = dummy.GetComponent<DummyDragObject>();
}
private void OnMouseDrag()
{
mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
dummy.transform.position = new Vector3(mousePosition.x, mousePosition.y,-0.02f);
}
private void OnMouseUp()
{
if(dummyDragObject.mergeReady)
{
//하고 싶은 기능은 여기에 넣으면 된다.
//dummyDragObject.cs 를 확인해야함...
Destroy(gameObject);
Destroy(dummy);
}
else
{
Destroy(dummy);
}
}
}
2.dummyDragObject.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DummyDragObject : MonoBehaviour
{
private Vector2 startPosition;
public bool mergeReady;
public string legend;
public GameObject node;
private void Start() {
startPosition = transform.position;
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (!collision.CompareTag("Node")) //Node가 아니면 return;
{
return;
}
if (!collision.GetComponent<Node>().turret) //merge할 turret이 없으면 return;
{
return;
}
//collision 한 대상은 node이다.
node = collision.gameObject;
float distance = Vector3.Distance(startPosition, node.GetComponent<Transform>().position);
if (distance < 1.3)
{
return; //가까우면 = 나 자신이니까 return;
}
Debug.Log("Collision!!!!");
string thisGameobjectTag = gameObject.tag;
string collisionTurretTag = node.GetComponent<Node>().turret.tag;
if( thisGameobjectTag == collisionTurretTag)
{
mergeReady=true;
}
}
private void OnTriggerStay2D(Collider2D collision) //OnTriggerEnter2D가 작동하지 않았을 경우를 대비한 보험
{
if (!collision.CompareTag("Node")) //Node가 아니면 return;
{
return;
}
if (!collision.GetComponent<Node>().turret) //merge할 turret이 없으면 return;
{
return;
}
//collision 한 대상은 node이다.
node = collision.gameObject;
float distance = Vector3.Distance(startPosition, node.GetComponent<Transform>().position);
if (distance < 1.3)
{
return; //가까우면 = 나 자신이니까 return;
}
Debug.Log("Collision!!!!");
string thisGameobjectTag = gameObject.tag;
string collisionTurretTag = node.GetComponent<Node>().turret.tag;
if( thisGameobjectTag == collisionTurretTag)
{
mergeReady=true;
}
}
private void OnTriggerExit2D(Collider2D collision)
{
mergeReady = false;
}
void OnDrawGizmos() //클릭한 것의 Range 그리기
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position,1.3f);
}
}
'유니티' 카테고리의 다른 글
[유니티] DOTween이용해서 Panel 깜빡이기 (0) | 2023.03.09 |
---|---|
[유니티] EASY SAVE와 GPGS를 이용하여 클라우드 저장하기 (0) | 2023.03.05 |
[유니티] 블루투스 헤드폰, 이어폰, 스피커 사용 시 소리 멈추는 현상 (0) | 2023.03.01 |
[유니티] Profiler를 이용하여 최적화 하기 (0) | 2023.02.24 |
[유니티 설정] 구글 GPGS를 이용하기 위해 proguard.txt 설정 (0) | 2023.02.24 |