切換
舊版
前往
大廳
主題

Unity初學日誌【第三人稱攝影機、防攝影機穿牆】

冰峰Will | 2019-06-17 20:30:13 | 巴幣 6 | 人氣 741

首先我只是個初學者,並沒說很強,我也知道這個有套件甚麼的,根本不用再打一次,
但我不希望用別人的套件,原因就是如果要改的話,我就必須要花時間了解別人的程式,
那我寧可已開始就自己寫,再參考別人的去不斷增進自己寫的程式,順便磨練一下自己的基礎。

至於發表這個文幹嘛呢~
主要還是因為我需要紀錄自己打的程式碼,
不然之前自己打的都沒有打成一篇文章,
不是看不太懂了,就是不知道把專案丟到哪去了呢~(恩
之後我也會陸陸續續地丟這樣的程式出來
有興趣者可以參考跟交流喔~
喔對了~這有參考一些人的程式碼,
所以可能有些人有看過類似的作法。

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

public class Third_person : MonoBehaviour
{
    [SerializeField]
    [Header("跟隨目標")]
    public Transform target; //跟隨目標
    public float x,y;

    [SerializeField]
    [Header("靈敏度")]
    public float Speed = 100;//靈敏度

    [SerializeField]
    [Header("當前攝影機與主角的距離")]
    public float distence;//當前攝影機與主角的距離

    [SerializeField]
    [Header("y軸上限視角")]
    [Range(-89, 89)]
    public float maxy=89;
    [SerializeField]
    [Header("y軸下限視角")]
    [Range(-89, 89)]
    public float miny=-45;

    private float fy=0;//計算y座標用
    private Quaternion rotationEuler;
    private Vector3 cameraPosition;
    
    void Start()
    {
        Cursor.visible = false;//隱藏滑鼠
        Cursor.lockState = CursorLockMode.Locked;//把滑鼠鎖定到螢幕中間
    }

    // Update is called once per frame
    void LateUpdate() {
        //讀取滑鼠的X、Y軸移動訊息
        x+=Input.GetAxis("Mouse X")*Speed*Time.deltaTime;
        fy=y-Input.GetAxis("Mouse Y")*Speed*Time.deltaTime;
        //限制y的角度
        if(!(fy<=miny||fy>=maxy)){
            y=fy;
        }
        //保護角度度數
        x%=360;
        y%=90;
        //運算攝影機座標、旋轉
        rotationEuler = Quaternion.Euler(y,x,0);
        cameraPosition = rotationEuler * new Vector3(0,0,-distence)+(target.position+new Vector3(0,1,0));

        //應用
        transform.rotation = rotationEuler;
        transform.position = cameraPosition;
            
        //防攝影機穿牆
        RaycastHit hit;
        if (Physics.Linecast(target.position+Vector3.up,transform.position+new Vector3(0,-0.1f,0), out hit))
        {
            if(hit.transform.name!="MainCamera"){
                transform.position=hit.point+new Vector3(0,0.1f,0);
            }
        }
        else if (Physics.Linecast(target.position+Vector3.up,transform.position, out hit))
        {
            if(hit.transform.name!="MainCamera"){
                transform.position=hit.point+new Vector3(0,0.1f,0);
            }
        }

    }
    
}

創作回應

更多創作