首先我只是個初學者,並沒說很強,我也知道這個有套件甚麼的,根本不用再打一次,
但我不希望用別人的套件,原因就是如果要改的話,我就必須要花時間了解別人的程式,
那我寧可已開始就自己寫,再參考別人的去不斷增進自己寫的程式,順便磨練一下自己的基礎。
至於發表這個文幹嘛呢~
主要還是因為我需要紀錄自己打的程式碼,
不然之前自己打的都沒有打成一篇文章,
不是看不太懂了,就是不知道把專案丟到哪去了呢~(恩
之後我也會陸陸續續地丟這樣的程式出來
有興趣者可以參考跟交流喔~
喔對了~這有參考一些人的程式碼,
所以可能有些人有看過類似的作法。
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);
}
}
}
}