본문 바로가기
UNITY/Unity Tip

Unity에서 자주 사용하는 C# 코드

by GREEN나무 2025. 5. 22.
728x90
  1. 기초 문법 & MonoBehaviour 패턴
  2. 게임 오브젝트 & 컴포넌트 조작
  3. Input 처리 & 이동 로직
  4. Physics 충돌 & 트리거
  5. 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