유니티

FBSGunTarget 1인칭 시점 object grab

nock_ji 2022. 5. 12. 17:37

FBSGunTarget 1인칭 시점 

object grab ! 

 

 

전체적인 구도

Player시점에 카메라가 위치함 , 앞에있는 큐브를 집는 로직 

 

 

Hierarchy창

 

 

Player Inspector

Hand Script 

public class Hand : MonoBehaviour
{

    Transform cam;
    Transform grabObject;
    public Transform hand;

    void Start()
    {
        cam = Camera.main.transform;
    }

    // Update is called once per frame
    void Update()
    {
        // 만약 잡은물체가 있다면
        if (grabObject != null)
        {
            // 잡은 물체를 목적지를 향해 이동시키고 싶다
            grabObject.position = Vector3.Lerp(grabObject.position, hand.position, Time.deltaTime * 5);

            //거리를 측정하고
            float distance = Vector3.Distance(grabObject.position, hand.position);
            //목적지에 도착했다면 (거리가 0.1이하라면) 파괴하고싶다
            if (distance <= 0.1f)
            {
                Destroy(grabObject.gameObject);
                grabObject = null;
            }

        }


        // 1. 만약 마우스 왼쪽버튼을 누르고있으면
        if (Input.GetButton("Fire1"))
        {
            // 2.카메라에서 카메라 앞방향으로 시선을 만들고, 
            Ray ray = new Ray(cam.position, cam.forward);
            // 3. 그 시선으로 바라보고 부딪힌 것이 있다면
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                // 4. 그 물체를 손으로 가져오고 싶다
                if (hitInfo.transform.CompareTag("Grabbable"))
                {
                    grabObject = hitInfo.transform;
                }
            }
        }
        //만약 마우스 왼쪽버튼을 뗐을 때
        else if (Input.GetButtonUp("Fire1"))
        {
            //잡고있는 물체가 있다면
            if (grabObject != null)
            {
                //놓고싶다
                grabObject = null;
            }
        }
    }
}

 

 

 

Game 창

 

 

MainCamera Inspector

CameraRotate Script

public class CameraRotate : MonoBehaviour
{
    float rx, ry, rotSpeed = 200;
    void Start()
    {
        
    }

    void Update()
    {
        float mx = Input.GetAxis("Mouse X");
        float my = Input.GetAxis("Mouse Y");

        rx += my * rotSpeed * Time.deltaTime;
        ry += mx * rotSpeed * Time.deltaTime;

        rx = Mathf.Clamp(rx, -60, 60);
        transform.eulerAngles = new Vector3(-rx, ry, 0);
    }
}

 

 

결과 : 마우스방향에 따라 화면이 움직이고, 마우스 왼쪽 버튼으로 큐브를 잡고 놓을 수 있음