3 분 소요

  • GameObject 밑에 Cylinder밑에 cube생성
  • MoveControl Script 생성

물체이동 (순간이동)

    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                transform.position = rHit.point;
            }
        }
    }

물체이동 (천천히 이동)

    public float _moveSpeed = 10;    //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
    Vector3 _goalPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
            }
        }
        if((_goalPosition - transform.position).magnitude >= 0.1f)
        transform.position += (_goalPosition - transform.position).normalized * _moveSpeed * Time.deltaTime;
        // (목표지점 - 내지점)을 normalized하면 방향만 남고, 속도를 곱해준다음, 프레임당 걸린시간(이전
프레임부터 지금프레임까지) 곱함
        else
            transform.position = _goalPosition;

    }

  • a포인트에서 b포인트로 이동하는 물체에는
    b로갔다는 방향(좌표)과,
    어느정도 빠르기로 간다는 속도와,
    얼마나걸렸는지에 대한 시간의 요소들이 작용함

Vector3.MoveToword

  • 내 위치와 목적지를 이용하여 속도값을 적용하여 이번 프레임에 도착해야할 위치를 얻어오는 명령
  • transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
  • 내 위치와 목표위치 , 스피드, 이번프레임에 움직여야할 시간을 입력하면 됨
   public float _moveSpeed = 10;   
    Vector3 _goalPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
            }
        }
        transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);

    }
}

방향전환1

    public float _moveSpeed = 10;    //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
    Vector3 _goalPosition;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
                transform.LookAt(_goalPosition);
            }
        }
        transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);

    }

  • transform.LookAt(_goalPosition)
  • _goalPosition방향으로 바라봄

방향전환 2

    public float _moveSpeed = 10;    //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
    public float _rotSpeed = 120; // 회전속도
    Vector3 _goalPosition;
    Quaternion _goalRotation; 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
                _goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
                    //목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
                    //normalized는 자동으로 됨
                transform.rotation = _goalRotation;


            }
        }
        transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);

    }
  • 목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
  • normalized는 내부에서 자동으로 됨

회전하는 모습 보이게 하기

  • Quaternion.RotateToword(내위치, 목표위치, 속도*이번프레임에 움직여야할 시간)
  • 내 현재방향과 바라봐야 하는 방향을 이용하여 회전속도값을 적용하여 이번 프레임에 움직여야 할 라디안 값을 얻어오는 명령
    public float _moveSpeed = 10;    //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
    public float _rotSpeed = 120; // 회전속도
    Vector3 _goalPosition;
    Quaternion _goalRotation; 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
                _goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
                    //목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
                    //normalized는 자동으로 됨


            }
        }
        transform.position = Vector3.MoveTowards(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
        transform.rotation = Quaternion.RotateTowards(transform.rotation, _goalRotation, _rotSpeed * Time.deltaTime);

    }

빠르게 이동(회전)하다가 천천히 이동(회전) / Lerp(Slerp)

    public float _moveSpeed = 10;    //자연스럽게 이동하려면 속도를 줘야함. 1초당 10이라는 뜻
    public float _rotSpeed = 120; // 회전속도
    Vector3 _goalPosition;
    Quaternion _goalRotation; 
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            RaycastHit rHit;
            int lMask = 1 << LayerMask.NameToLayer("Floor");
            Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);
            if(Physics.Raycast(r, out rHit, Mathf.Infinity, lMask))
            {
                _goalPosition = rHit.point;
                _goalRotation = Quaternion.LookRotation(_goalPosition - transform.position);
                    //목표방향으로 쳐다보게 하는것. 목표위치에서 내위치를 빼면 목표방향이 나옴
                    //normalized는 자동으로 됨


            }
        }
        transform.position = Vector3.Lerp(transform.position, _goalPosition , _moveSpeed*Time.deltaTime);
        transform.rotation = Quaternion.Slerp(transform.rotation, _goalRotation, _rotSpeed * Time.deltaTime);

    }

  • 일반적으로는 ToWards를 사용
  • 기믹들은 Lerp(Slerp) 사용

댓글남기기