Raycast
public class RaycastTester : MonoBehaviour
{
private void Update()
{
if(Physics.Raycast(transform.position, transform.forward, out RaycastHit hitInfo, 10f ))
{
Debug.Log(hitInfo.collider.gameObject.name);
Debug.DrawLine(transform.position, hitInfo.point, Color.green);
}
else
{
Debug.Log("None");
Debug.DrawLine(transform.position, transform.position + transform.forward * 10f, Color.red);
}
}
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, 3f);
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.green;
Gizmos.DrawLine(transform.position, transform.forward * 10);
}
}
Rigidbody
public class RigidbodyTest : MonoBehaviour
{
[SerializeField] Rigidbody rigid;
[SerializeField] float power;
private float xInput;
private void Update()
{
xInput = Input.GetAxis("Horizontal");
if (Input.GetButtonDown("Jump"))
{
rigid.AddForce(Vector3.up * power, ForceMode.Impulse);
}
}
private void FixedUpdate()
{
rigid.AddForce(Vector3.right * xInput * power, ForceMode.Force);
rigid.velocity = Vector3.right * power * xInput;
rigid.AddTorque(Vector3.up * xInput * power);
rigid.angularVelocity = Vector3.up * power * xInput;
}
}
Prefab
public class Monster : MonoBehaviour
{
* 프리팹 (Prefab)
* 미리 만들어 놓은 게임오브젝트, 템플릿, 설계도
* 프리팹 시스템을 이용하여 게임오브젝트를 생성, 설정 및 저장할 수 있음
* 자주 사용하는 게임오브젝트 구성을 복사하여 런타임 시점에 생성하려는 경우 사용
<프리팹 생성>
유니티 하이어라키 창의 게임오브젝트를 프로젝트 창을 드래그 & 드롭하여 프리팹에셋 생성
<프리팹 특징>
*게임오브젝트를 프리팹화 시킨 프리팹에셋은 게임오브젝트의 모든 컴포넌트, 속성값, 자식 게임오브젝트를 가지고 있음
* 프리팹에셋을 게임씬에 추가할 경우 프리팹인스턴스로 생성
* 프리팹에셋의 변경사항은 프리팹인스턴스에게 자동으로 반영
* 프리팹인스턴스에 변경사항이 있을 경우 해당 변경사항은 프리팹인스턴스에 영향을 받지 않음
* 프리팹에셋을 클래스, 프리팹인스턴스를 클래스의 인스턴스로 볼 수 있음
[SerializeField] Transform eyeTransform;
[SerializeField] float sightRange;
[SerializeField] float moveSpeed;
[SerializeField] GameObject target;
private void Update()
{
DetectTarget();
if (target != null)
{
Trace();
}
}
private void DetectTarget()
{
if (Physics.Raycast(eyeTransform.position, eyeTransform.forward, out RaycastHit hitInfo, sightRange))
{
Debug.DrawLine(eyeTransform.position, hitInfo.point, Color.green);
if (hitInfo.collider.gameObject.tag == "Player")
{
target = hitInfo.collider.gameObject;
}
else
{
target = null;
}
}
else
{
Debug.DrawLine(eyeTransform.position, eyeTransform.position + eyeTransform.forward * sightRange, Color.red);
target = null;
}
}
private void Trace()
{
transform.position = Vector3.MoveTowards(transform.position, target.transform.position, moveSpeed * Time.deltaTime);
transform.LookAt(target.transform.position);
}
}