-
충돌판정, 프리팹유니티/유니티 메인 2024. 1. 29. 19:12
1. 고양이가 키보드 버튼에 따라 왼쪽, 오른쪽으로 이동시키기 - playercontrol (player에 할당)
public class playercontrol : MonoBehaviour { void Start() { } void Update() { if(Input.GetKeyDown(KeyCode.LeftArrow)) { transform.Translate(-2, 0, 0); Debug.Log("왼쪽으로 이동!"); } if (Input.GetKeyDown(KeyCode.RightArrow)) { transform.Translate(2, 0, 0); Debug.Log("오른쪽으로 이동!"); } } }
2. 화살 밑으로 떨구기 - arrowcontrol (arrow에 할당)
public class NewBehaviourScript : MonoBehaviour { void Start() { } void Update() { transform.Translate(0,-0.009f,0); if(transform.position.y <-5.0) { Destroy(gameObject); } } }
// 생각보다 화살이 엄청빠름
3. 충돌 판정 - arrowcontrol 수정
public class NewBehaviourScript : MonoBehaviour { GameObject player; // 게임 오브젝트 player 선언 void Start() { this.player = GameObject.Find("player"); // 이름이 "player"를 찾아 this.player에 넣음 } void Update() { transform.Translate(0,-0.009f,0); if(transform.position.y <-5.0) { Destroy(gameObject); } Vector2 p1 = transform.position; // 화살의 위치 Vector2 p2 = this.player.transform.position; // 고양이(player)의 위치 Vector2 dir = p1 - p2; // 화살과 고양이 사이의 거리 float d = dir.magnitude; // 그 거리를 길이로 변환 float r1 = 0.5f; float r2 = 1.0f; // 이 2개는 각자의 최소 충돌판정 인정 거리 if(d < r1+r2) // 만약 화살과 고양이 사이거리가 최소인정거리보다 좁아진다면 { Destroy(gameObject) ; // 화살을 없앤다 } } }
4. 화살 프리팹
5. 프리팹으로 화살 공장 만들기
public class ArrowGenerator : MonoBehaviour { public GameObject arrowprefab; float span = 1.0f; // 1초 float delta = 0; void Update() { this.delta += Time.deltaTime; if(this.delta > this.span) // 1초가 되는 순간 { this.span = 0; // span을 초기화한뒤 GameObject go = Instantiate(arrowprefab); // 화살을 새로 생성 int r1 = Random.Range(-8, 8); // maxexclusive이기 때문에 -8부터 7까지이다 go.transform.position = new Vector3(r1, 7, 0); // 위치중 x좌표는 랜덤으로 생성 } } }
새 스크립트 arrowGenetaror 만든뒤 작성
6. HP 게이지 만들기 (UI)
근데 게임화면과 캔버스 크기가 너무 차이가 나는데 조절이 안된다. 알고보니 서로의 영점이 달라서 그렇다고 한다
7. HP 게이지 갱신하기. (충돌시 게이지 깎임)
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; //UI를 건드리기 때문에 필요 public class GameDirector : MonoBehaviour { GameObject hpGuage; // Start is called before the first frame update void Start() { this.hpGuage = GameObject.Find("hpGuage"); } public void DecreaseHP() { this.hpGuage.GetComponent<Image>().fillAmount -= 0.1f; //0.1씩 게이지가 깎임 } }
GameDirector 스크립트 만든뒤 코딩
빈 폴더 생성 후 GameDirector로 이름 변경
public class NewBehaviourScript : MonoBehaviour { GameObject player; void Start() { this.player = GameObject.Find("player"); } void Update() { transform.Translate(0,-0.009f,0); if(transform.position.y <-5.0) { Destroy(gameObject); } Vector2 p1 = transform.position; Vector2 p2 = this.player.transform.position; Vector2 dir = p1 - p2; float d = dir.magnitude; float r1 = 0.5f; float r2 = 1.0f; if(d < r1+r2) { // 감독 스크립트에 플레이어와 화살이 충돌했다고 전달 GameObject director = GameObject.Find("GameDirector"); director.GetComponent<GameDirector>().DecreaseHP(); Destroy(gameObject) ; } } }
'유니티 > 유니티 메인' 카테고리의 다른 글
Vector2 클래스, transform, GetMouseButtonDown (0) 2024.02.03 총정리 (용어정리) (0) 2024.02.03 물리엔진, 애니메이션, 씬 변환 (1) 2024.02.01 물리엔진 (0) 2024.01.31 프리팹, 충돌판정 복습 & 물리엔진 (1) 2024.01.31