이번시간에 한건 클래스이다.
클래스라는건 하나의 프로그램 또는 변수와 함수의 모음이라고 한다.
즉, 구조체이다.
동물이라는 틀(클래스) 만들고, 강아지,토끼,고양이(객체)로 만든다.
public class Animal
{
// * 클래스 : 하나의 프로그램 또는 변수와 함수의 모음으로 사용 가능
//ex) 동물이라는 틀(클래스)를 만들어놓고
// 각각의 강아지, 토끼, 고양이(객체)를 만들 수 있음
public string name;
public int age;
public void Welcome()
{
Debug.Log("이름 : " + name + " 나이 : " + age);
}
} //클래스 선언
public class cClass : MonoBehaviour
{
Animal Dog = new Animal();
Animal Cat = new Animal();
Animal Rabbit = new Animal();
// Start is called before the first frame update
void Start()
{
Dog.name = "강아지";
Dog.age = 10;
Dog.Welcome();
Cat.name = "고양이";
Cat.age = 5;
Cat.Welcome();
Rabbit.name = "토끼";
Rabbit.age = 6;
Rabbit.Welcome();
}
}
이 클래스, 함수에서는 상단위에 애니멀이란 클래스를 선언, 객체로
네임, 나이 웰컴 함수를 지정해놨다.
그리고 독, 켓, 레빗을 각각 애니멀클래스형 객체로 생성하고
각각의 객체 내 요소에 값을 입력하고, 객체 요소함수를 호출하여 출력문을 했단다.
다음은 클래스2를 만들어 사용했다.
public class guard
{
public int damge = 10;
private int num = 5;
public void detect()
{
Debug.Log("적 발견");
}
} //클래스 선언
public class cClass2 : MonoBehaviour
{
// * 클래스 : 하나의 프로그램
guard grd = new guard();
void Start()
{
grd.detect();
Debug.Log("공격준비");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
Debug.Log("공격했다" + grd.damge +
"의 데미지를 주었다.");
}
}
}
int num은 왜 넣었는지는 모르겠지만, grd란 클래스를 선언 후 A를 누르면 ~공격했다. grd.damage를 주었다.를 출력한다.
퍼블릭과 프리바이트의 개념이 있다.
퍼블릭을 선언하면 다른 클래스나 함수에서 사용가능하다.
프리바이트를 사용하면 내부에서만 사용 가능하다.
생략을 하면 기본적으로 프리바이트이다. 즉, 지역변수, 전역변수의 개념이다.
grd.num은 프리바이트이기때문에 접근 불가능하다.
다음은 함수의 인자에 따른 특징에 설명이다.
public class cLocal : MonoBehaviour
{
int num = 5;
//클래스는 내부 함수 외부에 선언된 변수를 전역변수
// 전역변수는 클래스 내부 어디든 사용 가능
// Start is called before the first frame update
void Start()
{
int num = 7;
//지역변수와 전역변수 이름이 같다면
//지역변수를 우선시 하게됨
//클래스 내부 함수 내부에 선언된 변수를 지역변수
// 지역변수는 함수 내부에서만 사용가능
// 함수가 끝나면 소멸
Debug.Log(num);
Name();
Name(5);
}
void Name()
{
Debug.Log("내 이름은 유니티입니다.");
}
void Name(int age)
{
Debug.Log("내 나이는 " + age + "입니다.");
}
//함수의 이름이 같더라도 인자의 갯수가 다르다면 다른 함수취급
int Number(int num)
{
return num;
}
float Number(float num)
{
return num;
}
//함수의 이름이 같더라도 매개변수(인자)의 자료형이 다르다면 다른함수 취급
// * 함수의 이름이 같고 매개변수(인자)가 없다면 2번째 함수는 사용 불가
}
즉, 함수의 이름이 같더라도 매개변수 or 아귀먼트, 인자가 다르면 다른 함수 취급한다는 특징에 대해 설명한다. 보통은 이렇게 안한다. 왜냐면 햇깔리니깐
다음은var 자료형에 대한 이야기인데
//var : 컴퓨터가 자동으로 데이터를 파악해
//해당 변수의 형식을 지정함
// - 선언과 동시에 초기화를 해주어야함
// - 지역변수로만 사용 가능
// - 한번 형식이 지정되면 다른 형식의 값은 할당이 불가능
// Use this for initialization
void Start()
{
var num = 1;
Debug.Log("num의 타입은 : " + num.GetType());
var num1 = 50.2f;
Debug.Log("num1의 타입은 : " + num1.GetType());
var num2 = -50.25;
Debug.Log("num2의 타입은 : " + num2.GetType());
var nickname = '안';
Debug.Log("nickname의 타입은 : " + nickname.GetType());
var name = "유니티";
Debug.Log("name의 타입은 : " + name.GetType());
var check = true;
Debug.Log("check의 타입은 : " + check.GetType());
}
js에서도 사용되는 형식인데 cs에서도 사용되는줄은 몰랐다.
public class cNormalized : MonoBehaviour
{
void Update()
{
if (Input.GetButton("Horizontal")
|| Input.GetButton("Vertical"))
//만약 Horizontal과 Vertical에 해당하는 키를 눌렀다면
{
float inputX = Input.GetAxis("Horizontal");
float inputY = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(inputX, inputY, 0);
transform.Translate(movement.normalized * 5 * Time.deltaTime);
//이동시켜줌
}
}
}
다음은 노말라이즈(정규화)라는데,
이건 므브먼트라는 객체를 새로 생성하되, 입력된 값을의 값을 넣고
무브먼트안에 노말라이즈드 값을 따라 이동하는 모양을 보여준다.
드뎌 씬 전환한다.
using UnityEngine.SceneManagement;
public class cSceneChange : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
SceneManager.LoadScene("Main");
}
if (Input.GetKeyDown(KeyCode.S))
{
SceneManager.LoadScene("Game");
}
}
}
프로젝트 -> 씬으로 들어가서 해당 씬을 만들고,
파일 빌드 세팅즈에서 씬을 추가해준다. (드래그)
게임 처음에 시작하는 씬을 0번째로 넣어준다.
그 다음은 씬 룩엣
public class cLookAt : MonoBehaviour
{
public GameObject Target;
//public : 외부참조가능
// Update is called once per frame
void Update()
{
transform.LookAt(Target.transform);
}
}
타겟의 참조를 하는 기능이다.
다음은 인스턴트 오브젝트를 만드는것
public class cInstantiate : MonoBehaviour
{
public GameObject Bullet;
//자료형 앞에 public을 쓰면 인스펙터창에
//해당 변수가 표시됨
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(Bullet, transform.position, Quaternion.identity);
//하이어라키에 있는 오브젝트보다는
//오브젝트를 프로젝트창에 넣어서 프리팹화를
//시킨 후 프리팹을 복제하는 것이 좋음
}
}
}
프리펩을 복사하는 기능을 활용하는게 좋다. 오브젝트를 정해놓고 복제를 해준다.
인자를 보면 오브젝트 (오리지날)
대충 스피어를 만든 후, 인스턴스 에이트 (이벤트처리함수)
캡슐을 만들고 (복제대상)을 넣어준다.
캡슐 안에는 cBullet를 넣는다.
public class cBullet : MonoBehaviour
{
// Use this for initialization
void Start()
{
Destroy(gameObject, 10.0f);
}
// Update is called once per frame
void Update()
{
transform.Translate
(Vector3.forward * 10 * Time.deltaTime);
}
}
이러면 원본 불릿도 삭제됨으로 참조할 대상이 사라진다. 이를 에셋에서 프리펩화한다. 그 후 하이라이키에 있는 캡슐을 지워준다. 그러면 계속 참조된다.
다음은 씨 tooltip 이다.
[Tooltip("갯수를 나타내 줍니다.")]
public int num;
[Tooltip("이름를 표시해줍니다..")]
public string name;
[Header("현재 오브젝트의 이동속도")]
public int Speed = 5;
[Header("게임이 시작된 시간")]
public float cTime;
[SerializeField]
//[SerializeField] : private 선언한 변수를
//Inspector상에 표시시켜줌
private int Potion = 5;
private string F;
[HideInInspector]
//[HideInInspector] : public 선언한 변수를
//Inspector상에 안보이게 해줌
public int Str = 10;
public bool check = true;
Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
rb.useGravity = false;
}
즉, 인스팩터 상에 나오는 변수들의 설정할때, 상단에 표기된다.
다음은 이제 광선이다.
public class cRay : MonoBehaviour
{
public Camera Cam;
Ray ray;
//ray라는 변수를 통해서 광선(Ray)을 선언
void Start()
{
Cam = Camera.main;
//MainCamera태그를 가진
//카메라를 cam이라는 변수에 넣어줌
}
void Update()
{
ray = Cam.ScreenPointToRay(Input.mousePosition);
//카메라의 스크린 좌표에서 안쪽으로 향하는 광선을 발사한다.
Debug.DrawLine(ray.origin, ray.direction * 500f,
Color.magenta);
//DrawLine(시작점, 방향 * 거리, 색상)
//ray.origin 은 ray의 원점.
//ray.direction은 광선의 방향 그리고 500만큼의
//길이를 곱해주었음
}
}
여기서부터는 좀 어렵다. 이걸 원격으로 공부한다니.....나야 겨우 이해했지만 비전공자는 뭐가 될까?
메인카메라는 카메라 태그를 말한다.
public class cRayCast : MonoBehaviour
{
Ray ray; //레이
RaycastHit hitInfo;
// Update is called once per frame
void Update()
{
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//레이생성
if (Physics.Raycast(ray, out hitInfo))
//만약 레이가 오브젝트와 충돌했다면
{
Destroy(hitInfo.transform.gameObject);
//충돌한 오브젝트 삭제
}
}
}
카메라 기준으로, 마우스 포인트를 체크해서 레이와 오브젝트가 충돌 시 오브젝트를 삭제한다.
다음은 씨 콜리전이라는 기능이다.
콜리전을 사용하기 전에는
public class cCollision : MonoBehaviour
{
//OnCollision() 계통 함수의 발생 조건
//- 어느 한쪽의 게임오브젝트에 Rigidbody가
//추가돼 있어야합니다.
//Rigidbody에는 Is Kinematic이 비활성화
//되어 있어야 합니다.
//또한 콜라이더의 Is Trigger가 비활성화
//되어 있어야 합니다.
void OnCollisionEnter(Collision other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Collision 충돌 시작!");
}
}
void OnCollisionStay(Collision other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Collision 충돌 중!");
}
}
void OnCollisionExit(Collision other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Collision 충돌 종료!");
}
}
}
콜라이전을 오브젝트마다 설정해주는게 매우 중요하다.
메시 콜라이더는 생각보다 안좋다?
시 트리거는 양 쪽다 트리거로 되어있고,
public class cTrigger : MonoBehaviour
{
//OnTrigger() 계통 함수의 발생 조건
//- 어느 한쪽 콜라이더의 Is Trigger가
//활성화 되어 있어야 하고 어느 한쪽의
//게임오브젝트에 Rigidbody가 추가 되어
//있어야 합니다.
void OnTriggerEnter(Collider other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Trigger 충돌 시작");
}
}
void OnTriggerStay(Collider other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Trigger 충돌 중");
}
}
void OnTriggerExit(Collider other)
{
if (other.transform.name == "Plane")
{
Debug.Log("Trigger 충돌 종료");
}
}
}
온트리거 엔터, 스테이, 엑시트로 되어있다.
인자는 콜리더, 함수는 콜리전
씨테그 후,
public class cTag : MonoBehaviour
{
void OnCollisionEnter(Collision other)
{
if (other.transform.tag == "Enemy")
{
Destroy(other.gameObject);
}
}
void Update()
{
if (Input.GetKey(KeyCode.A))
{
transform.Translate(Vector3.left * 5 * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D))
{
transform.Translate(Vector3.right * 5 * Time.deltaTime);
}
}
}
각 태그에 닿는 콜리전이 적용된다.
댓글