728x90
- 기초 문법 & MonoBehaviour 패턴
- 게임 오브젝트 & 컴포넌트 조작
- Input 처리 & 이동 로직
- Physics 충돌 & 트리거
- UI & 오디오 제어
✅ 1. 기초 문법 & MonoBehaviour 패턴
// 1. MonoBehaviour 상속받은 스크립트 구조
public class PlayerController : MonoBehaviour {
void Start() {
Debug.Log("게임 시작");
}
void Update() {
Debug.Log("매 프레임 호출");
}
}
// 2. SerializeField로 private 변수 노출
[SerializeField] private float speed = 5f;
// 3. public 변수는 인스펙터에 자동 노출
public int hp = 100;
// 4. GameObject 활성화/비활성화
gameObject.SetActive(false);
// 5. Destroy로 오브젝트 제거
Destroy(gameObject, 2f); // 2초 후 파괴
// 6. Invoke로 일정 시간 후 함수 호출
Invoke(nameof(Explode), 3f);
// 7. Coroutine으로 지연 실행
StartCoroutine(MoveAfterDelay(2f));
IEnumerator MoveAfterDelay(float time) {
yield return new WaitForSeconds(time);
transform.Translate(Vector3.forward);
}
// 8. 태그로 오브젝트 찾기
GameObject player = GameObject.FindWithTag("Player");
// 9. 컴포넌트 가져오기
Rigidbody rb = GetComponent<Rigidbody>();
// 10. this 키워드 사용해 명확한 참조
this.transform.Rotate(0, 90, 0);
✅ 2. 게임 오브젝트 & 컴포넌트 조작
// 11. 오브젝트 생성 (프리팹 사용)
Instantiate(bulletPrefab, transform.position, Quaternion.identity);
// 12. 자식 오브젝트 탐색
Transform weapon = transform.Find("Weapon");
// 13. 새로운 자식 설정
childObject.transform.SetParent(this.transform);
// 14. 오브젝트 위치 변경
transform.position = new Vector3(0, 1, 0);
// 15. 오브젝트 회전
transform.Rotate(Vector3.up * 90);
// 16. 오브젝트 크기 변경
transform.localScale = new Vector3(2, 2, 2);
// 17. 오브젝트 이름 변경
gameObject.name = "Enemy";
// 18. Tag 변경
gameObject.tag = "Enemy";
// 19. Layer 설정
gameObject.layer = LayerMask.NameToLayer("Enemy");
// 20. 비활성화된 오브젝트도 찾기
GameObject obj = GameObject.Find("Boss");
if (obj != null) Debug.Log(obj.activeSelf);
✅ 3. Input 처리 & 이동 로직
// 21. 키 입력 확인
if (Input.GetKeyDown(KeyCode.Space)) {
Jump();
}
// 22. 수평/수직 축 입력
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// 23. 이동 구현
transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);
// 24. 마우스 클릭 감지
if (Input.GetMouseButtonDown(0)) {
Fire();
}
// 25. 마우스 위치를 Ray로 변환
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast(ray, out RaycastHit hit)) {
Debug.Log(hit.point);
}
// 26. 회전 조작 (마우스)
float mouseX = Input.GetAxis("Mouse X");
transform.Rotate(Vector3.up * mouseX);
// 27. 점프 구현
if (Input.GetButtonDown("Jump")) {
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
// 28. 스프린트
float speed = Input.GetKey(KeyCode.LeftShift) ? sprintSpeed : walkSpeed;
// 29. 타임스케일 조절 (일시정지 등)
Time.timeScale = 0f;
// 30. 키 리맵핑 체크
if (Input.GetButton("Fire1")) {
Shoot();
}
✅ 4. Physics 충돌 & 트리거
// 31. Rigidbody로 물리 적용
[SerializeField] Rigidbody rb;
rb.AddForce(Vector3.forward * 500);
// 32. 충돌 감지 (OnCollisionEnter)
void OnCollisionEnter(Collision col) {
Debug.Log("충돌 대상: " + col.gameObject.name);
}
// 33. 트리거 감지 (OnTriggerEnter)
void OnTriggerEnter(Collider other) {
if (other.CompareTag("Enemy")) {
Destroy(other.gameObject);
}
}
// 34. 물리 레이어 무시
Physics.IgnoreLayerCollision(6, 7);
// 35. 오브젝트 끌어당기기
rb.velocity = (target.position - transform.position).normalized * 5f;
// 36. Rigidbody Kinematic 설정
rb.isKinematic = true;
// 37. 중력 비활성화
rb.useGravity = false;
// 38. 캐릭터 컨트롤러 이동
CharacterController cc = GetComponent<CharacterController>();
cc.Move(Vector3.forward * Time.deltaTime);
// 39. 물리 재질 적용 (바운스 등)
collider.material.bounciness = 1f;
// 40. Raycast로 벽 감지
if (Physics.Raycast(transform.position, transform.forward, 2f)) {
Debug.Log("벽 있음");
}
✅ 5. UI & 오디오 제어
// 41. TextMeshPro 텍스트 변경
textMeshPro.text = "Hello, World!";
// 42. Button 이벤트 등록
button.onClick.AddListener(OnClickStart);
// 43. 이미지 변경
image.sprite = newSprite;
// 44. 슬라이더 값 읽기
float value = slider.value;
// 45. 캔버스 비활성화
canvas.enabled = false;
// 46. AudioSource로 효과음 재생
audioSource.PlayOneShot(shootClip);
// 47. BGM 루프 재생
audioSource.clip = bgmClip;
audioSource.loop = true;
audioSource.Play();
// 48. UI에 오브젝트 동기화
uiObject.transform.position = Camera.main.WorldToScreenPoint(target.position);
// 49. 타임라인 재생
timeline.Play();
// 50. 애니메이터로 애니메이션 제어
animator.SetTrigger("Attack");
✅ 6. 애니메이션 (Animator 제어)
// 51. 애니메이터 컴포넌트 가져오기
Animator anim = GetComponent<Animator>();
// 52. bool 파라미터로 상태 전환
anim.SetBool("IsRunning", true);
// 53. Trigger 파라미터로 상태 전환
anim.SetTrigger("Jump");
// 54. 현재 애니메이션 상태 확인
AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0);
if (state.IsName("Attack")) {
Debug.Log("공격 애니메이션 중");
}
// 55. 애니메이션 이벤트 함수 (애니메이션에서 호출)
public void OnFootstep() {
footstepAudio.Play();
}
✅ 7. NavMesh 기반 AI 이동
// 56. NavMeshAgent 컴포넌트 가져오기
NavMeshAgent agent = GetComponent<NavMeshAgent>();
// 57. 특정 위치로 이동 지시
agent.SetDestination(target.position);
// 58. 이동 중 여부 확인
if (agent.remainingDistance <= agent.stoppingDistance) {
Debug.Log("목표 지점 도착");
}
// 59. 장애물 우회 반응 속도 조절
agent.angularSpeed = 120f;
agent.acceleration = 8f;
// 60. 실시간 목적지 변경
void Update() {
agent.SetDestination(player.position);
}
✅ 8. Addressable Assets 로딩
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
// 61. 프리팹 Addressable로 로딩 및 생성
Addressables.InstantiateAsync("EnemyPrefab", Vector3.zero, Quaternion.identity);
// 62. 에셋 비동기 로드
Addressables.LoadAssetAsync<GameObject>("ItemPrefab").Completed += handle => {
GameObject item = handle.Result;
Instantiate(item, spawnPoint.position, Quaternion.identity);
};
// 63. 로드 후 수동 해제
Addressables.Release(handle);
// 64. Handle의 상태 체크
if (handle.Status == AsyncOperationStatus.Succeeded) {
Debug.Log("로드 성공");
}
// 65. 다중 에셋 로드 (주소 리스트)
List<string> keys = new List<string>() { "Enemy1", "Enemy2" };
Addressables.LoadAssetsAsync<GameObject>(keys, obj => {
Instantiate(obj);
});
✅ 9. Shader/Material 프로퍼티 제어
// 66. 머티리얼 색상 변경
GetComponent<Renderer>().material.color = Color.red;
// 67. Shader float 파라미터 설정
material.SetFloat("_Glossiness", 0.5f);
// 68. Shader Vector 값 적용
material.SetVector("_EmissionColor", new Vector4(0.5f, 0.5f, 0.5f, 1));
// 69. 실시간 시간 기반 애니메이션
material.SetFloat("_TimeOffset", Time.time);
// 70. 머티리얼 인스턴싱 (다른 오브젝트 영향 방지)
GetComponent<Renderer>().material = new Material(material);
✅ 10. ScriptableObject 활용
// 71. ScriptableObject 정의
[CreateAssetMenu(menuName = "Game/ItemData")]
public class ItemData : ScriptableObject {
public string itemName;
public Sprite icon;
public int power;
}
// 72. ScriptableObject 참조
[SerializeField] ItemData itemInfo;
// 73. 정보 출력
Debug.Log(itemInfo.itemName);
// 74. 게임 중 동적으로 ScriptableObject 복사
ItemData clone = Instantiate(itemInfo);
// 75. 여러 오브젝트가 동일 데이터 공유
enemy.weaponData = itemInfo;
npc.weaponData = itemInfo;
'UNITY > Unity Tip' 카테고리의 다른 글
프로젝트 창 Colume Layout (0) | 2025.04.07 |
---|