Raycast, Rigidbody, 프리팹 Prefab

sejun-Lee·2025년 4월 17일

UnityEngine

목록 보기
5/12

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; // new를 붙이거나 rigidbody가 아닌 다른 이름을 쓰자.
    [SerializeField] float power; // 힘의 세기

    private float xInput;

    private void Update()
    {
        xInput = Input.GetAxis("Horizontal"); // A, D키 입력 - 좌 우

        if (Input.GetButtonDown("Jump"))
        {
            rigid.AddForce(Vector3.up * power, ForceMode.Impulse);  // Impulse 점프는 예외로 Update() 에 사용
        }

    }

    private void FixedUpdate()  // addForce 는 FixedUpdate()에서 써야함. 컴퓨터 성능에 따라 달라질 수 있기 때문.
    {
        // 1. 힘 가해주기 : 가속시키기
        rigid.AddForce(Vector3.right * xInput * power, ForceMode.Force); // Force는 지속적으로 힘을 가하는 메서드. 무게에 따라 힘이 달라짐
        // Acceleration 무게에 상관없이 속도가 빨라짐
        // Impulse 는 한방에 힘을 펑! 하고 줌

        // 2. 속도를 설정하기 : 속도를 원하는 대로 설정
        rigid.velocity = Vector3.right * power * xInput;

        // 3. 회전력 가해주기
        rigid.AddTorque(Vector3.up * xInput * power);

        // 4. 회전속도 설정하기
        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();	// Physics로 타겟확인

        if (target != null)	// target 이 있으면
        {
            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")	//DrawLine으로 player접촉시 타겟 확인
            {
                target = hitInfo.collider.gameObject;
            }
            else
            {
                target = null;
            }
            //TankController tank = hitInfo.collider.gameObject.GetComponent<TankController>();
            //if (tank != 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);
    }
}
profile
초보 개발자

0개의 댓글