02. カメラ動かす

1. カメラを動かそう

前回、ボールを動かすところまでは行きましたが、カメラが動いていませんでした。

このままだと、ボールを見失ってしまうかもしれません。てか、たぶん見失います。

なのでボールを追跡するような感じでカメラ追従のコードを書いていこうと思います。

カメラ用のスクリプトを作成。

この”CameraController”にカメラがボールに合わせて動くようにコードを書いていく。

2. コードを書いていく

ボールを打つとそれに伴ってカメラが動くようにコードを作っていきます。

    
using Unity.VisualScripting;
using UnityEngine;

public class CameraController : MonoBehaviour
{
    public Transform target;    //�Ǐ]���������^�[�Q�b�g
    [SerializeField] private Vector3 offset = new Vector3(0f, 5f, -7f); //�J�����ƃ^�[�Q�b�g�̋���
    [SerializeField] private float smoothSpeed = 5f;    //�Ǐ]���x
    [SerializeField] private float stopVelocityThreshold = 0.1f;    //�{�[������~�����Ƃ݂Ȃ����x��臒l
    private Rigidbody targetRb; //�^�[�Q�b�g��rb
    private bool isFollowing = false;   //�J������Ǐ]�����邩�ǂ���

    private void Start()
    {
        if(target != null)
        {
            targetRb = target.GetComponent();
        }
    }

    private void LateUpdate()
    {
        if (target == null) return;

        UpdateFollowState();

        if (isFollowing)
        {
            Vector3 desiredPosition = target.position + offset; //�ڕW�ʒu�̌v�Z
            Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed * Time.deltaTime); //���݈ʒu��ڕW�ʒu�܂ŃX���[�Y�Ɉړ�
            transform.position = smoothedPosition;
            transform.LookAt(target);
        }
    }

    //�Ǐ]���J�n�E��~����֐�
    void UpdateFollowState()
    {
        if (targetRb == null) return;

        if(targetRb.linearVelocity.magnitude > stopVelocityThreshold)
        {
            isFollowing = true;
        }else if(targetRb.linearVelocity.magnitude <= stopVelocityThreshold && targetRb.IsSleeping())
        {
            isFollowing = false;
        }
    }
}

    

なんか、コメントだけ文字化けしてますね。まあ、コードはしっかり動くので、まぁいいや。

このスクリプトを”Main Camera”にくっつけ、ターゲットにボールをセットします。

実際に動かすとこんな感じですね。

ボールを打つとカメラが滑らかに動くように作れました。

3. まとめ

今回は、ボールを打つとカメラが動くようにコードを書いてみました。次は、ボールが壁にボールが当たった時にいい感じにボールが跳ね返るようしていきます。