Unity 화면번쩍이는방법 How to flash screen

1. UI Image를 이용해 화면을 가득해운 플래쉬할 이미지를 생성합니다.

2. 플래쉬 이미지에 알파값을 0으로 설정합니다.

3. 다음 코드를 필요한 클래스에서 지정합니다.

// Flash Image
bool changed;
public Image mFlashImage;
public float flashSpeed = 5f;
public Color flashColour = new Color(1f, 0f, 0f, 0.1f);

4. Update() 에 다음코드로 조건이 맞을 경우 알파값변경을 이용해 화면을 플래쉬합니다.

void Update() {

//Update Flash image once changed   
if(changed)
{
   mFlashImage.color = flashColour;
}
   else
{
   mFlashImage.color = Color.Lerp(mFlashImage.color, Color.clear, flashSpeed * Time.deltaTime);
}
   // Change back to false
   changed = false;

5. 필요한곳에서 boolean 값을 바꿔주면 화변플래쉬를 할수있습니다.

Unity 스크립트로 애니메이션 전환하기

유니티에서 다른 오브젝트에서 스크립트로 에니메이션을 트리거하는 방법입니다.

다음코드는 메뉴화면에 있는 메인메뉴버튼에 에니메이션 스크립트가 설정되었을때 다른 오브젝트에서 그것을 불러와 실행시키는 예제입니다.

// Assign the menu button
// 애니메이션을 작동하는 버튼
public GameObject mMenuBtn;
// Assign the menu holder
// 에니메이터를 담은 Canvas
public GameObject panel;
// Assign an animator
// 스크립트를 실행할때 지정할 애니메이터
private Animator animator;

// 메뉴를 담은 Canvas를 찾습니다.
panel = GameObject.FindGameObjectWithTag("MainMenu");
// Canvas에 설정된 애니메이터를 부릅니다.
animator = panel.GetComponent();

// Call closing animation
// 버튼 스크립트를 호출한후
MainMenuBtn menuBtn = (MainMenuBtn) mMenuBtn.GetComponent(typeof(MainMenuBtn));
// 버튼안에 애니메이션 전환 메서드를 호출합니다.
// 이때 animator를 지정해줘야하니 위에서 설정한 애니메이터를 반환해줍니다.
menuBtn.DisableBoolAnimator(animator);

Unity 다른 게임오브젝트에서 메서드호출하기 (Call a function in another gameObject’s script)

유니티에서 서로 다른게임오브젝트에 해당된 Class에서 메서드를 호출하는 방법입니다.
예를 들면 플레이어 오브젝트에서 데미지를 주어서 적의 오브젝트에 HP를 감소시킨다던지 하는 방법으로 사용될 수 있습니다.

먼저 불러올 두번째 오브젝트의 Class 입니다.

using UnityEngine;
public class ScriptB : MonoBehaviour
{
  public void DoSomething()
  {
     Debug.Log("I got it!");
  }
}

다음은 첫번째 오브젝트에서 해당 오브젝트를 찾은후 스크립트를 불러들입니다.

// Find the object.
GameObject origin = GameObject.Find("somegameobjectname");

// Assign the script
ScriptB other = (ScriptB) origin.GetComponent(typeof(ScriptB));

// Call method.
other.DoSomething();

Unity Unable to merge android manifests Google Play Games Services

Unity 에서 안드로이드로 빌드후 실행하다

“Unable to merge android manifests Google Play Games Services”

라는 에러가 발생하면 Aseets/Plugins/Android 폴더에 있는

AndroidManifest.xml 에 다음 한줄을 추가한후 다시 시도해봅니다.

uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23"

정확한 위치는 아래 캡쳐화면과 같으며 < />를 포함해서 넣어주세요.

123.PNG

Unity 스크립트로 콘 만들기(Cone)

C# 으로 작성되었습니다.

MeshFilter filter = gameObject.AddComponent();
Mesh mesh = filter.mesh;
mesh.Clear();
 
float height = 1f;
float bottomRadius = .25f;
float topRadius = .05f;
int nbSides = 18;
int nbHeightSeg = 1; // Not implemented yet
 
int nbVerticesCap = nbSides + 1;
#region Vertices
 
// bottom + top + sides
Vector3[] vertices = new Vector3[nbVerticesCap + nbVerticesCap + nbSides * nbHeightSeg * 2 + 2];
int vert = 0;
float _2pi = Mathf.PI * 2f;
 
// Bottom cap
vertices[vert++] = new Vector3(0f, 0f, 0f);
while( vert <= nbSides )
{
	float rad = (float)vert / nbSides * _2pi;
	vertices[vert] = new Vector3(Mathf.Cos(rad) * bottomRadius, 0f, Mathf.Sin(rad) * bottomRadius);
	vert++;
}
 
// Top cap
vertices[vert++] = new Vector3(0f, height, 0f);
while (vert <= nbSides * 2 + 1)
{
	float rad = (float)(vert - nbSides - 1)  / nbSides * _2pi;
	vertices[vert] = new Vector3(Mathf.Cos(rad) * topRadius, height, Mathf.Sin(rad) * topRadius);
	vert++;
}
 
// Sides
int v = 0;
while (vert <= vertices.Length - 4 )
{
	float rad = (float)v / nbSides * _2pi;
	vertices[vert] = new Vector3(Mathf.Cos(rad) * topRadius, height, Mathf.Sin(rad) * topRadius);
	vertices[vert + 1] = new Vector3(Mathf.Cos(rad) * bottomRadius, 0, Mathf.Sin(rad) * bottomRadius);
	vert+=2;
	v++;
}
vertices[vert] = vertices[ nbSides * 2 + 2 ];
vertices[vert + 1] = vertices[nbSides * 2 + 3 ];
#endregion
 
#region Normales
 
// bottom + top + sides
Vector3[] normales = new Vector3[vertices.Length];
vert = 0;
 
// Bottom cap
while( vert  <= nbSides )
{
	normales[vert++] = Vector3.down;
}
 
// Top cap
while( vert <= nbSides * 2 + 1 )
{
	normales[vert++] = Vector3.up;
}
 
// Sides
v = 0;
while (vert <= vertices.Length - 4 )
{			
	float rad = (float)v / nbSides * _2pi;
	float cos = Mathf.Cos(rad);
	float sin = Mathf.Sin(rad);
 
	normales[vert] = new Vector3(cos, 0f, sin);
	normales[vert+1] = normales[vert];
 
	vert+=2;
	v++;
}
normales[vert] = normales[ nbSides * 2 + 2 ];
normales[vert + 1] = normales[nbSides * 2 + 3 ];
#endregion
 
#region UVs
Vector2[] uvs = new Vector2[vertices.Length];
 
// Bottom cap
int u = 0;
uvs[u++] = new Vector2(0.5f, 0.5f);
while (u <= nbSides)
{
    float rad = (float)u / nbSides * _2pi;
    uvs[u] = new Vector2(Mathf.Cos(rad) * .5f + .5f, Mathf.Sin(rad) * .5f + .5f);
    u++;
}
 
// Top cap
uvs[u++] = new Vector2(0.5f, 0.5f);
while (u <= nbSides * 2 + 1)
{
    float rad = (float)u / nbSides * _2pi;
    uvs[u] = new Vector2(Mathf.Cos(rad) * .5f + .5f, Mathf.Sin(rad) * .5f + .5f);
    u++;
}
 
// Sides
int u_sides = 0;
while (u <= uvs.Length - 4 )
{
    float t = (float)u_sides / nbSides;
    uvs[u] = new Vector3(t, 1f);
    uvs[u + 1] = new Vector3(t, 0f);
    u += 2;
    u_sides++;
}
uvs[u] = new Vector2(1f, 1f);
uvs[u + 1] = new Vector2(1f, 0f);
#endregion 
 
#region Triangles
int nbTriangles = nbSides + nbSides + nbSides*2;
int[] triangles = new int[nbTriangles * 3 + 3];
 
// Bottom cap
int tri = 0;
int i = 0;
while (tri < nbSides - 1)
{
	triangles[ i ] = 0;
	triangles[ i+1 ] = tri + 1;
	triangles[ i+2 ] = tri + 2;
	tri++;
	i += 3;
}
triangles[i] = 0;
triangles[i + 1] = tri + 1;
triangles[i + 2] = 1;
tri++;
i += 3;
 
// Top cap
//tri++;
while (tri < nbSides*2)
{
	triangles[ i ] = tri + 2;
	triangles[i + 1] = tri + 1;
	triangles[i + 2] = nbVerticesCap;
	tri++;
	i += 3;
}
 
triangles[i] = nbVerticesCap + 1;
triangles[i + 1] = tri + 1;
triangles[i + 2] = nbVerticesCap;		
tri++;
i += 3;
tri++;
 
// Sides
while( tri <= nbTriangles )
{
	triangles[ i ] = tri + 2;
	triangles[ i+1 ] = tri + 1;
	triangles[ i+2 ] = tri + 0;
	tri++;
	i += 3;
 
	triangles[ i ] = tri + 1;
	triangles[ i+1 ] = tri + 2;
	triangles[ i+2 ] = tri + 0;
	tri++;
	i += 3;
}
#endregion
 
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
 
mesh.RecalculateBounds();
mesh.Optimize();

Unity 스크립트로 박스만들기(Cube)

유니티에서 3D파일을 사용하지않고 스크립트로 박스를 만드는코드입니다.

C#으로 Start()에 넣어주신후 임의의 오브젝트를 생성후 게임을 실행하면

런타임에서 도형이 그려지는것을 확일할 수 있습니다.

// You can change that line to provide another MeshFilter
MeshFilter filter = gameObject.AddComponent();
Mesh mesh = filter.mesh;
mesh.Clear();
 
float length = 1f;
float width = 1f;
float height = 1f;
 
#region Vertices
Vector3 p0 = new Vector3( -length * .5f,	-width * .5f, height * .5f );
Vector3 p1 = new Vector3( length * .5f, 	-width * .5f, height * .5f );
Vector3 p2 = new Vector3( length * .5f, 	-width * .5f, -height * .5f );
Vector3 p3 = new Vector3( -length * .5f,	-width * .5f, -height * .5f );	
 
Vector3 p4 = new Vector3( -length * .5f,	width * .5f,  height * .5f );
Vector3 p5 = new Vector3( length * .5f, 	width * .5f,  height * .5f );
Vector3 p6 = new Vector3( length * .5f, 	width * .5f,  -height * .5f );
Vector3 p7 = new Vector3( -length * .5f,	width * .5f,  -height * .5f );
 
Vector3[] vertices = new Vector3[]
{
	// Bottom
	p0, p1, p2, p3,
 
	// Left
	p7, p4, p0, p3,
 
	// Front
	p4, p5, p1, p0,
 
	// Back
	p6, p7, p3, p2,
 
	// Right
	p5, p6, p2, p1,
 
	// Top
	p7, p6, p5, p4
};
#endregion
 
#region Normales
Vector3 up 	= Vector3.up;
Vector3 down 	= Vector3.down;
Vector3 front 	= Vector3.forward;
Vector3 back 	= Vector3.back;
Vector3 left 	= Vector3.left;
Vector3 right 	= Vector3.right;
 
Vector3[] normales = new Vector3[]
{
	// Bottom
	down, down, down, down,
 
	// Left
	left, left, left, left,
 
	// Front
	front, front, front, front,
 
	// Back
	back, back, back, back,
 
	// Right
	right, right, right, right,
 
	// Top
	up, up, up, up
};
#endregion	
 
#region UVs
Vector2 _00 = new Vector2( 0f, 0f );
Vector2 _10 = new Vector2( 1f, 0f );
Vector2 _01 = new Vector2( 0f, 1f );
Vector2 _11 = new Vector2( 1f, 1f );
 
Vector2[] uvs = new Vector2[]
{
	// Bottom
	_11, _01, _00, _10,
 
	// Left
	_11, _01, _00, _10,
 
	// Front
	_11, _01, _00, _10,
 
	// Back
	_11, _01, _00, _10,
 
	// Right
	_11, _01, _00, _10,
 
	// Top
	_11, _01, _00, _10,
};
#endregion
 
#region Triangles
int[] triangles = new int[]
{
	// Bottom
	3, 1, 0,
	3, 2, 1,			
 
	// Left
	3 + 4 * 1, 1 + 4 * 1, 0 + 4 * 1,
	3 + 4 * 1, 2 + 4 * 1, 1 + 4 * 1,
 
	// Front
	3 + 4 * 2, 1 + 4 * 2, 0 + 4 * 2,
	3 + 4 * 2, 2 + 4 * 2, 1 + 4 * 2,
 
	// Back
	3 + 4 * 3, 1 + 4 * 3, 0 + 4 * 3,
	3 + 4 * 3, 2 + 4 * 3, 1 + 4 * 3,
 
	// Right
	3 + 4 * 4, 1 + 4 * 4, 0 + 4 * 4,
	3 + 4 * 4, 2 + 4 * 4, 1 + 4 * 4,
 
	// Top
	3 + 4 * 5, 1 + 4 * 5, 0 + 4 * 5,
	3 + 4 * 5, 2 + 4 * 5, 1 + 4 * 5,
 
};
#endregion
 
mesh.vertices = vertices;
mesh.normals = normales;
mesh.uv = uvs;
mesh.triangles = triangles;
 
mesh.RecalculateBounds();
mesh.Optimize();

Unity Perspective UI 만드는법

유니티에서 Perspective UI 적용하는 법입니다.

기본적인 방법은 2번재 카메라를 UI전용으로 적용한후

Rotation을 이용해서 화면에 왜곡되어지게 보이게합니다.

유니티는 글로 설명하기 어려운 부분이 있어 영상을 첨부합니다.

Perspective UI 만드는 내용을 담은 튜토리얼입니다.