티스토리 뷰
강의를 열심히 듣는데도 유니티에서 만져야될 창이나 버튼이 많아서 그런지 중간중간 놓치는게 꽤 있었다 그래서 질문을 많이 했다 하하.. 특히 애니메이터에서 많이 헤맸다
💻 Unity
Animator
애니메이션을 제어하는 핵심 컴포넌트다. 캐릭터나 오브젝트의 움직임을 조작할 때 사용하며, 애니메이션 State(상태) 전환, 파라미터 조정, 트리거 설정 등의 기능을 제공한다.
애니메이션간 상태 전환을 설정할 때 Transitions을 사용한다. Animator vs Animation
구분 | Animator | Animation |
사용 방식 | 여러 개의 애니메이션을 조합하고 상태를 제어 | 단일 애니메이션 실행 |
상태 전환 | State Machine을 사용하여 설정 | 수동으로 코드 작성 필요 |
코드 제어 | Parameters를 사용하여 제어 | Play() 메서드를 사용하여 직접 실행 |
추천 사용 사례 | 캐릭터 움직임, 복잡한 애니메이션 시스템 | 간단한 UI 애니메이션, 오브젝트 회전 |
Layor
오브젝트를 그룹화하여 충돌 감지, 렌더링, 카메라 필터링 등을 제어하는 기능이다. 주로 Physics(물리 충돌), Camera Culling Mask(카메라 필터링), Raycast(광선 검출) 등에 사용된다.
Layer의 역할
충돌 감지 | 특정 Layer 간의 충돌을 비활성화하여 성능 최적화 가능 |
카메라 필터링 | 특정 Layer만 렌더링하도록 카메라 설정 가능 |
Raycast 제어 | Raycast가 특정 Layer만 감지하도록 설정 가능 |
렌더링 제어 | 특정 Layer만 보이거나 보이지 않게 설정 가능 |
Layer vs Tag
구분 | layer | Tag |
역할 | 충돌 감지, 렌더링 제어 | 특정 오브젝트 식별 |
중복 가능 여부 | 한 오브젝트에 하나만 적용 가능 | 여러 개의 오브젝트가 같은 Tag를 가질 수 있음 |
사용 예시 | 충돌 감지, Raycast 필터링 | 적군/아군 식별, 특정 오브젝트 찾기 |
활용 예제
- Raycast 필터링을 활용하여 성능 최적화
- Layer Collision Matrix를 조정하여 불필요한 충돌 제거
- 카메라 Culling Mask를 설정하여 특정 오브젝트만 렌더링
Physic Material
오브젝트의 물리적 반응(마찰력, 탄성 등)을 설정하는 머티리얼이다. 충돌 시 미끄러짐, 튕김 정도 등을 조정할 수 있으며, Rigidbody 및 Collider와 함께 사용된다.
Physic Material의 역할
마찰력(Friction) | 표면의 미끄러짐 정도 조절 |
탄성(Bounciness) | 충돌 시 튕기는 정도 설정 |
충돌 조합 설정 | 오브젝트끼리 충돌 시 어떻게 반응할지 결정 |
Physic Material 속성
Dynamic Friction | 움직일 때의 마찰력 |
Static Friction | 멈춰 있을 때의 마찰력 |
Bounciness | 충돌 시 튕기는 정도 |
Friction Combine | 두 오브젝트의 마찰력을 어떻게 조합할지 설정 |
Bounce Combine | 두 오브젝트의 탄성을 어떻게 조합할지 설정 |
Physic Material vs 일반 Material
구분 | Physic Material | 일반 Material |
역할 | 물리적 반응 조절 | 오브젝트의 시각적 표현 |
속성 | 마찰력, 탄성 등 | 색상, 텍스처 등 |
적용 대상 | Collider | Mesh Renderer |
예제 | 얼음(미끄러짐), 고무공(튕김) | 금속 질감, 유리 투명도 |
🕹️ 게임 만들기
1945
배경 설정
- Stage_1 이미지 설정
- Material Shader Mobile/Particles/AlphaBlended로 변경 한 후 이미지 넣어줌
- Background 오젝트에 넣어서 크기를 늘려준다
public float scrollSpeed = 0.02f;
public Material MyMaterial { get; set; }
void Start()
{
MyMaterial = GetComponent<Renderer>().material;
}
void Update()
{
float newOffsetY = MyMaterial.mainTextureOffset.y + scrollSpeed * Time.deltaTime;
Vector2 newOffset = new Vector2(0, newOffsetY);
MyMaterial.mainTextureOffset = newOffset;
}
Player
- 이미지의 Piexel pers unit을 원래 이미지의 크기와 맞추기
- 이미지를 Slice한 후 두개를 한 번에 하이어라키에 드래그하면 애니메이터가 자동으로 생성됨 Player에 Player_left, Player_right 드래그하기
- 오브젝트 Order in Layer 1로
- 애니메이터에 left, right 파라미터 만든 후 Transition 설정해줌
- left, right Animator Loop Time 체크 해제, up은 체크 활성
public float moveSpeed = 5f;
private Vector2 minBounds;
private Vector2 maxBounds;
public Animator MyAnimator { get; set; }
void Start()
{
MyAnimator = GetComponent<Animator>();
// 화면 경계 설정
Camera cam = Camera.main;
Vector3 bottomLeft = cam.ViewportToWorldPoint(new Vector3(0, 0, 0));
Vector3 topRight = cam.ViewportToWorldPoint(new Vector3(1, 1, 0));
minBounds = new Vector2(bottomLeft.x, bottomLeft.y);
maxBounds = new Vector2(topRight.x, topRight.y);
}
void FixedUpdate()
{
float moveX = Input.GetAxis("Horizontal") * moveSpeed * Time.deltaTime;
float moveY = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
SetAnimation();
Vector3 newPosition = transform.position + new Vector3(moveX, moveY, 0);
// 경계를 벗어나지 않도록 위치 제한
newPosition.x = Mathf.Clamp(newPosition.x, minBounds.x, maxBounds.x);
newPosition.y = Mathf.Clamp(newPosition.y, minBounds.y, maxBounds.y);
transform.position = newPosition;
}
private void SetAnimation()
{
if (Input.GetAxis("Horizontal") <= -0.25f)
{
MyAnimator.SetBool("left", true);
}
else
{
MyAnimator.SetBool("left", false);
}
if (Input.GetAxis("Horizontal") >= 0.25f)
{
MyAnimator.SetBool("right", true);
}
else
{
MyAnimator.SetBool("right", false);
}
if (Input.GetAxis("Vertical") >= 0.25f)
{
MyAnimator.SetBool("up", true);
}
else
{
MyAnimator.SetBool("up", false);
}
}
Item
- Rigidbody의 gravity 0으로, Freeze Rotation Z 체크
- PhysisMaterial 2D 머테리얼 생성후 Friction 0으로, Bounciness 1로
- Collider의 Material에 Bounce 머테리얼 추가
- 프리팹으로 만들어 주기
- Item Layer 추가해서 설정
- Project Settings > Physics 2D > Item끼리 충돌 해제
- Ctrl+D로 여러개 만들어주기
public float ItemVelocity = 120f;
Rigidbody2D rig;
void Start()
{
rig = GetComponent<Rigidbody2D>();
rig.AddForce(new Vector3(ItemVelocity, ItemVelocity, 0f));
}
📝 과제
1945 미사일 만들기
public class Launcher : MonoBehaviour
{
public float shootInterval = 0.4f;
public GameObject MyBUllet;
void Start()
{
StartCoroutine(ShootCoroutine());
}
IEnumerator ShootCoroutine()
{
while (true)
{
Shoot();
yield return new WaitForSeconds(shootInterval);
}
}
void Shoot()
{
Instantiate(MyBUllet, transform.position, Quaternion.identity);
}
}
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float moveSpeed = 2.0f;
void Start()
{
}
void Update()
{
transform.Translate(0, moveSpeed * Time.deltaTime, 0);
}
private void OnTriggerEnter2D(Collider2D collision)
{
Destroy(gameObject);
}
private void OnBecameInvisible()
{
Destroy(gameObject);
}
}
'Unity > 멋쟁이사자처럼' 카테고리의 다른 글
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 16일차 회고 (0) | 2025.04.03 |
---|---|
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 15일차 회고 (0) | 2025.03.13 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 13일차 회고 (0) | 2025.03.11 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 12일차 회고 (0) | 2025.03.11 |
멋쟁이 사자처럼 부트캠프 유니티 게임 개발 4기 11일차 회고 (0) | 2025.03.07 |