ゲームプログラマーの寄り道

ゲームプログラマの寄り道

ソースコード公開系ブログ

ソースコード公開系ブログ

Unityでの壁貫通しない三人称カメラのソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CheckObstacles : MonoBehaviour {
    // カメラの元の位置
    [SerializeField]
    private Vector3 cameraPrePosition;
    [SerializeField]
    private Transform player;
    private RaycastHit hit;
    // カメラの移動スピード
    [SerializeField]
    private float cameraMoveSpeed = 3f;
    private const float _distance = 5.2f;//
    private Vector3 _offset = new Vector3(0f, 1.0f, -_distance);

    private Vector3 _lookDown = new Vector3(30f, 0f, 0f);
    [SerializeField]
    bool ON=true;
    void Start()
    {
        // player = transform.root;
        // 初期位置を設定
        transform.position = player.TransformPoint(_offset);
        transform.LookAt(player/*, Vector3.up*/);
    }
    void Update()
    {
  Vector3 desiredPosition = player.TransformPoint(_offset);
            if (desiredPosition.y < player.position.y)
            {
                desiredPosition.y = player.position.y;
            }

        // カメラが障害物と接触してたら障害物の場所に移動
        if (Physics.Linecast(player.position/* + Vector3.up*/, transform.position, out hit, LayerMask.GetMask("Field", "Enemy", "EnemyHit"))&& Vector3.Distance(player.position,transform.position)< _distance)
        {
            transform.position = Vector3.Lerp(transform.position, hit.point, cameraMoveSpeed * Time.deltaTime);
            
            // 障害物と接触してなければ元のカメラ位置に移動
        }
        else if(ON)
        {
          
            Vector3 lerp = Vector3.Lerp(transform.position, desiredPosition, cameraMoveSpeed * Time.deltaTime);
            Vector3 toTarget = player.position - lerp;
            toTarget.Normalize();
            toTarget *= _distance;
            transform.position = player.position - toTarget;
            // 元の位置ではない時だけ元の位置に移動
            //if (transform.localPosition != cameraPrePosition)
            //{
            //    transform.localPosition = Vector3.Lerp(transform.localPosition, cameraPrePosition, cameraMoveSpeed * Time.deltaTime);
            //}
        }
        transform.LookAt(player/*, Vector3.up*/);
   //     transform.Rotate(_lookDown);
        // レイを視覚的に確認
        Debug.DrawLine(player.position /*+ Vector3.up*/, transform.position, Color.red, 0f, false);
    }
    //オブジェクトが衝突したとき
    void OnTriggerEnter(Collider other)
    {
        ON = false;
    }

    //オブジェクトが離れた時
    void OnTriggerExit(Collider other)
    {
        ON = true;
    }

    //オブジェクトが触れている間
    void OnTriggerStay(Collider other)
    {
        if(Vector3.Distance(player.position, transform.position) >= _distance)
        {
            ON = true;
        }
    }
}
***募集***
一緒にブログを運営してくれる人募集しています。
主な作業は修理作業です。画像足りなかったら拾ってくるとか、誤字の修正などです。
見出し増やすなど、見た目に関する所お願いします。
Twitterに連絡くれれば反応できます。

しんーーご (@shi_k_7) | Twitter