Orthographic = 원금감이 없는 2D 를 표현할때 사용
size 4 는 카메라 기준 위 아래 기준 4월드유닛 길이, 가로길이는 디스플레이 비율에 따라 늘어남.
자르려는 스플릿시트 이미지 클릭후 sprite mode > multiple > pixels Per Unit > 100 > Filter mode > point > apply > sprite editor 조작시 시트이미지, 다중 이미지 잘라내기 가능
연결되는 애니매이션 저장후 animation model > animator > parameters > +int > 연결될 애니매이션 우클릭 매이크 트랜지션으로 연결, 트랜지션화살표 클릭후 has exit time 체크 해제시 앞의 애니매이션이 다 끝나지 않아도 연결된 다음 애니매이션으로 넘어감 + 아래에 condttions 에 연결 애니매이션 Equals > 1 추가
// 애니매이션이 1 이면 열결된 트랜지션화살표 대로 애니매이션이 실행됨
+ C# 에서 animator.SetInteger("IsDie",1); // 유니티 애니메이터에 IsDie 를 만들어 놨고
// 이 파라미터가 1이 됐을때 Die 의 모습으로 넘어가도록 구현
Sprite Renderer의 Sorting Order는 스프라이트의 렌더링 순서를 결정하는 값 높을수록 화면과 가깝게 보인다
rigidbody 2D > 물리적인 처리 , circle collider 2D > 물리적인 충돌을 구현,
Polygon collider 2D > 다각형 이미지 형태의 충돌범위 구현
circle collider 2D 에 is Trigger 가 꺼져있으면 충돌을 하고 체크로 켜져있으면 부딪혔다고 통보만 하고 귀신처럼 통과됨.
Unity에서 충돌 처리는 Collider와 Rigidbody를 통해 구현됩니다.
-주요 충돌 처리 함수
-OnCollisionEnter: 충돌 시작 시 호출
-OnCollisionStay: 충돌이 유지되는 동안 호출
-OnCollisionExit: 충돌이 끝났을 때 호출
-OnTriggerEnter/Stay/Exit: Trigger Collider와의 상호작용을 처리
C#
void Start()
{
animator = GetComponent<Animator>();
_rigidbody = GetComponent<Rigidbody2D>();
}
GetComponent의 의미는 작성중인 스크립트가 부착된 인스펙터 오브젝트에 찾고자하는 컴포넌트가 있는지, 있다면 그걸 반환해주는 역할을 해준다.
GetComponent 에 InChildren 이어 작성을 해주면 현재 하이어라키 오브젝트에서 기능을 찾는거와 달리 하위오브젝트, 자식 오브젝트까지 검색을 진행한다.
if(Input.GetKeyDown(KeyCode.Space) || Input.GetMouseButton(0))
{ // 0=좌클&스마트폰 터치, 1=우클릭, 2=휠클릭, 4 5 = 마우스 사이드버튼
isFlap = true;
}
스페이스바를 입력할때마다 true 값을 받는다 || 마우스 좌클릭을 입력할때마다 true 값을 받는다
트러블 슈팅 /
유니티 강의를 따라보면서 게임을 만들던중 게임스크린 터치를 마우스로 입력시 연속으로 입력받아 무수히 많은 동작이 발생한다. 이의 해결법으론
Input.GetMouseButtonDown(0)를 사용한다 강의에선 Input.GetMouseButton(0) 으로 사용했기에
마우스연속입력이 발생하였다 이 기능은 마우스 왼쪽 버튼 클릭 순간만 감지한다 이외의 기능들로는
Input.GetMouseButtonUp(0) // 버튼을 떼는 순간 감지,
EventSystem을 활용해 UI 요소 위에서 클릭된 경우 입력을 무시 가능,
Coroutine을 사용해 클릭 입력에 딜레이를 추가할수있다. 트러블 슈팅 /
Time.deltaTime은 Update() 에서만 쓸수있는 값으로 이전 프레임과 현재 프레임 사이의 시간을 반환합니다.
주요 역할예: speed * Time.deltaTime으로 일정 속도로 이동 가능 프레임 독립적인 움직임을 구현하기 위해 사용, 컴퓨터 성능마다 프레임이 달라도 동일한 시간동안 동일한 거리를 이동할수있게 만들어줌.
구조체란 a에 저장된 값을 변경시키지 않고 복사 하여 거져올때 사용 struct 타입 클래스 에서 똑같이 사용시 값이 변경됨
struct StructExample
{
public int Value;
}
class Program
{
static void Main()
{
StructExample s1 = new StructExample { Value = 10 };
StructExample s2 = s1; // 값 복사
s2.Value = 20;
Console.WriteLine(s1.Value); // 10 (변화 없음)
Console.WriteLine(s2.Value); // 20
}
}
유니티 강의 자료중
private void FixedUpdate() // 물리처리를 하기위해서 사용 뜻은 고정 업데이트
{
if (isDead) return;
Vector3 velocity = _rigidbody.velocity;
// 우측에있는 물리적 힘을 가져온다, 값을 (복사)가져왔기에 _rigidbody가 변한게아님 ★
velocity.x = forwardSpeed; // 일정한 속도로 진행
if (isFlap) // 점프를 했는지 안했는지 구분, 기본값 false 터치하면 true
{
velocity.y += flapForce; // 터치를 했을때 점프하는힘 더해주기
isFlap=false; // 한번 터치했기에 바로 false로 만들어주기
}
_rigidbody.velocity = velocity; //값을 넣은 ★ velocity 를 _rigidbody 에 넣는다
/*Rigidbody 컴포넌트를 넣어준 순간부터 오브젝트는 중력의 영향을 받아 y축의 속력이 음수로 내려갑니다. 이 값은 계속해서 변하기 때문에 해당 오브젝트의 속도를 알기 위해서는 변수에 _rigidbody.velocity 값을 넣어줘야만 합니다.*/
float angle = Mathf.Clamp((_rigidbody.velocity.y * 10f), -90, 90);
// Mathf.Clamp 메서드로 min,max 값 정하고 리지드바디에 있는값 기준으로 사용
transform.rotation = Quaternion.Euler(0, 0, angle);
// 각도 제어하는 식 , 움직일 축을 확인후 앵글기입
}
=========================이해안갔던 내용===========================재복습 필수
public class Obstacle : MonoBehaviour // Obstacle 장애물 , MonoBehaviour를 상속받음 → 유니티의 컴포넌트로(유니티 기능) 동작함.
{
public float highPosY = 1f; // Obstacle 이 상하로 이동할때 얼마나 이동할 것이냐 정하는값
public float lowPosY = -1f; // 장애물이 배치될 최대 높이 와 최소 높이 를 설정.
// 장애물의 y 위치를 이 범위 내에서 랜덤하게 배치할 것임.
public float holeSizeMin = 1f; // Obstacle 장애물의 탑과 바텀 위, 아래 장애물의 공간을
public float holeSizeMax = 3f; // 얼마나 가져갈거냐
//장애물 사이의 구멍 크기(플레이어가 지나갈 공간)의 최소/최대 값을 지정.
public Transform topObject; // 위쪽 장애물, 아래쪽 장애물
public Transform bottomObject; // 이 두 오브젝트의 위치를 조절해서
// 장애물의 구멍 크기와 위치를 결정함.
public float widthpadding = 4f; // 장애물 오브젝트를 배치할때 사이의 폭을 얼마나 할지
// 새로운 장애물을 생성할 때 이전 장애물에서 얼마나 떨어진 위치에 배치할지 결정하는 값.
public Vector3 SetRandomPlace(Vector3 lastPosition, int obstaclCount)
{ // lastPosition 란 이전 장애물의 위치 > 새 장애물의 위치는 이 값을 기준으로 정해짐.
//obstaclCount: 장애물 개수 // 새로운 장애물 위치를 Vector3 타입으로 반환.
float holeSize = Random.Range(holeSizeMin, holeSizeMax);
// 구멍 크기(holeSize)를 최소~최대 범위에서 랜덤하게 설정.
float halfHoleSize = holeSize / 2;
//위쪽 장애물과 아래쪽 장애물을 구멍 크기의 절반만큼 위,아래로 배치할 준비.
topObject.localPosition = new Vector3(0, halfHoleSize);
//topObject는 구멍 크기의 절반만큼 위쪽으로 이동.
bottomObject.localPosition = new Vector3(0, -halfHoleSize);
//bottomObject는 구멍 크기의 절반만큼 아래쪽으로 이동.
//장애물 사이에 원하는 크기의 구멍이 생김.
Vector3 placePosition = lastPosition + new Vector3(widthpadding, 0);
placePosition.y = Random.Range(lowPosY, highPosY);
//placePosition → 이전 장애물 위치(lastPosition)에서
//widthpadding만큼 오른쪽으로 이동. → 장애물끼리 일정한 간격을 유지.
//placePosition.y = Random.Range(lowPosY, highPosY); → y 위치는 랜덤하게 설정
//(장애물이 위/ 아래로 배치되는 느낌을 줌).
transform.position = placePosition; // 새로운 위치를 장애물 오브젝트에 적용
return placePosition; // 새로 설정된 장애물 위치를 반환.
}
}