[스프라이트를 사용한 이펙트]
유니티에서 제공하는 애니메이션을 통해 스프라이트 이미지로 이펙트 효과를 내는 방법을 말함.
스프라이트를 통해 이펙트를 만드는 법은 매우 간단하다.
우선 이펙트로 사용될 스프라이트 이미지를 구한다.
Project View에서 이펙트로 사용될 이미지를 클릭하면 Inspector에 다음과 같은 정보가 나온다.
여기서 SpriteMode를 Single-> Multiple로 바꿔주고 Sprite Editor를 누른다.
Sprite Editor창이 뜨면 다음과 같이 생겼다.
Sprite Editor는 하나의 이미지를 유니티 내부에서 원하는 크기로 잘라서 사용할 수 있게 만든 시스템이다.
여기서 상단의 Slice를 누르고 다시 한번 생성되는 작은 창에서 Slice를 누르게 되면 현재 그림과 같은 회색의 네모난 박스들이 이미지 주변을 감싸게 될 것이다.
간혹 이미지와 관계없이 회색 박스의 사이즈가 결정되는 경우가 있는데 이때는 직접 사이즈를 조절 해주면 된다.
이미지가 잘 잘렸다면 우측 상단에 Apply를 눌러 적용시키고 창을 닫는다.
다시 한번 Project View의 이미지를 보게 되면 다음과 같이 생성이 된다.
이제 이펙트 오브젝트를 생성하자.
이펙트 이미지를 Hierarchy View로 옮긴다.
그리고 오브젝트의 이름을 변경한다.
그 다음 애니메이션을 만들어보자.
우선 Animation View를 살펴보면 아래와 같이 구성되어 있다.
이펙트 오브젝트를 클릭한 상태에서 Animation View의 붉은 네모 박스부분을 클릭하면 Create New Clip이 나타나고 이를 클릭하자.
그러면 다음과 같이 파일을 생성할 수 있다. 파일 이름을 입력후 저장한다.
자른 이펙트 이미지를 모두 선택하여 Animation창에 드래그 앤 드랍하면 다음과 같이 나타난다.
이미지들을 선택하여 드래그 하면서 이미지 간의 간격을 맞춘다.
이 상태로 이펙트를 쓰게되면 이미지가 계속 화면에 남아 애니메이션을 돌고 있을 것이다.
따라서 간단한 스크립트를 적용시켜주자.
Effect.cs 만들기
using UnityEngine;
using System.Collections;
// 이펙트 애니메이션의 프레임이 마지막 프레임일때 이펙트 오브젝트를 삭제하는 클래스
public class Effect : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void Destroy(){
Destroy(this.gameObject);
}
}
해당 스크립트를 만든 후에 오브젝트에 연결 한다.
Animation View에서 원하는 위치에 붉은 선을 위치 시키고 네모 박스로 둘러쌓인 버튼을 누른다.
해당 버튼은 애니메이션 중 스크립트의 함수를 적용시키도록 만드는 버튼이다.
버튼을 클릭하게 되면 해당 창이 뜬다.
여기서 Function을 통해 원하는 함수를 실행할 수 있다.
Destroy를 클릭하고 창을 닫는다.
이후 이펙트 오브젝트를 Project View로 드래그앤 드랍하여 프리팹으로 만든다.
이제 해당 오브젝트를 원하는 상황에 맞춰 Instantiate함수를 이용하여 해당 이펙트 오브젝트를 생성하여 띄워주기만 하면 된다.
예시
using UnityEngine;
using System.Collections;
// 충돌 시 이펙트를 발생 시키는 것을 처리하는 클래스
public class Crash : MonoBehaviour {
// 발생 시킬 이펙트
public GameObject effectObj; => 이 부분에 이펙트 오브젝트를 넣으면 된다.
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter2D(Collider2D other)
{
// 현재 오브젝트가 Player 태그 이고
if( this.gameObject.tag == "Player" )
{
// 충돌한 오브젝트가 Enemy 태그 일때
if( other.gameObject.tag == "Enemy" )
{
// 이펙트를 현재 오브젝트의 위치에 소환
Vector3 spawn = this.gameObject.transform.position;
spawn.z = effectObj.gameObject.transform.position.z;
Instantiate(effectObj, spawn, Quaternion.identity); => 이런식으로 원하는 위치에 이펙트 오브젝트를 생성해준다.
}
}
// 현재 오브젝트가 Enemy 태그 이고
if( this.gameObject.tag == "Enemy" )
{
// 충돌한 오브젝트가 Player 태그 일때
if( other.gameObject.tag == "Player")
{
// 이펙트를 현재 오브젝트의 위치에 소환
Vector3 spawn = this.gameObject.transform.position;
spawn.z = effectObj.gameObject.transform.position.z;
Instantiate(effectObj, spawn, Quaternion.identity); => 이런식으로 원하는 위치에 이펙트 오브젝트를 생성해준다.
}
}
}
}
[간단한 씬 전환 효과 페이드 인, 페이드 아웃]
설명
페이드 인, 페이드 아웃은 기본적으로 해당 그림의 알파값 즉, 투명도를 조절하여 화면을 전환하는 형식이다.
여기서 가장 중요한 것은 투명도를 조절하는 것이다.
유니티의 색은 0.0~1.0 사이 이다.
간단하게 하는 방법
화면 크기에 맞는 검은 그림을 준비한다.
Hierarchy View에 그림을 끌어 올리고 Sorting Layer를 가장 위로 두게 한다.
스크립트를 만들고 해당 스크립트의 Update부분에
페이드 인일 경우
this.gameObject.GetComponent<SpriteRenderer> ().color -= new Color(0.0f, 0.0f, 0.0f, 0.001f); // 해당 스크립트를 가진 이미지의 알파값을 조절하는 것.
if (this.gameObject.GetComponent<SpriteRenderer> ().color.a < 0.0f) { // 검은 이미지의 투명도가 0.0이 되면 검은 이미지가 투명하게 보이지 않는다.
// 해당씬의 행동을 활성화
}
페이드 아웃 일 경우
Hierarchy View에 검은 그림의 알파 값을 미리 0.0으로 맞춰준다.
this.gameObject.GetComponent<SpriteRenderer> ().color += new Color(0.0f, 0.0f, 0.0f, 0.001f);
if (this.gameObject.GetComponent<SpriteRenderer> ().color.a > 1.0f) { // 검은 이미지의 투명도가 1.0이 되면 검은 화면이 나타난다.
// 다음씬으로 전환
}
해당 스크립트를 검은 그림에 붙여주면 된다.