物體移動(dòng):http://www.manew.com/thread-114623-1-1.html
一、Transform類 (兩種)
Transform?組件用于描述物體在空間中的狀態(tài)殴俱,它包括位置(position),旋轉(zhuǎn)(rotation)和縮放(scale)。其實(shí)所有的移動(dòng)都會(huì)導(dǎo)致position的改變
1、transform.position += new Vector3 ( 0,0,3 );
這里所說的通過Transform組件來移動(dòng)物體,指的是直接操作Transform來控制物體的位置(position)根欧。
改變方式可以是自定義的三位向量,也可以是transform的自身方向端蛆,也可以是vector3的世界坐標(biāo)方向
局部(自身)坐標(biāo)凤粗,只有坐標(biāo)軸的正方向沒有負(fù)方向
Transform.forward?向前
Transform.right?向右
Transform.up?向上
世界坐標(biāo)
Vector3.forward?向前
Vector3.back?向后
Vector3.left?向左
Vector3.right?向右
Vector3.up?向上
Vector3.down?向下
Vector3.zero?零點(diǎn)
Vector3.one?指向(1,1,1)的單位向量
void?Update(){
? ?? ???//局部坐標(biāo) Local
? ?? ???//transform.position += transform.forward * Time.deltaTime;
? ?? ???//transform.position += transform.right * Time.deltaTime;
? ?? ???//transform.position += transform.up * Time.deltaTime;
? ?? ???//世界坐標(biāo) Global
? ?? ???//transform.position += new Vector3(0, 0, 2) * Time.deltaTime;
? ?? ???//transform.position += Vector3.forward * Time.deltaTime;
? ?? ???//transform.position += Vector3.back * Time.deltaTime;
? ?? ???//transform.position += Vector3.left * Time.deltaTime;
? ?? ???//transform.position += Vector3.right * Time.deltaTime;
? ?? ???//transform.position += Vector3.up * Time.deltaTime;
? ?? ???//transform.position += Vector3.down * Time.deltaTime;
? ?? ???//transform.position += Vector3.one * Time.deltaTime;
? ? }
2、Transform.Translate ( transform.forward * Time.deltaTime );
該方法可以將物體從當(dāng)前位置今豆,移動(dòng)到指定位置嫌拣,并且可以選擇參照的坐標(biāo)系。?當(dāng)需要進(jìn)行坐標(biāo)系轉(zhuǎn)換時(shí)呆躲,可以考慮使用該方法以省去轉(zhuǎn)換坐標(biāo)系的步驟异逐。
void?Update(){
? ?? ???//在使用transform自身局部坐標(biāo)時(shí),第二個(gè)參數(shù)的作用不大
? ?? ???//transform.Translate(transform.forward * Time.deltaTime);
? ?? ???//transform.Translate(transform.forward * Time.deltaTime, Space.Self);
? ?? ???//transform.Translate(transform.forward * Time.deltaTime, Space.World);
? ?? ???//不寫第二個(gè)參數(shù)插掂,默認(rèn)局部坐標(biāo)灰瞻,使用第二個(gè)參數(shù)設(shè)置為世界坐標(biāo)時(shí)使用世界坐標(biāo)系
? ?? ???//transform.Translate(Vector3.forward * Time.deltaTime);
? ?? ???//transform.Translate(Vector3.forward * Time.deltaTime, Space.Self);
? ?? ???//transform.Translate(Vector3.forward * Time.deltaTime, Space.World);
? ??}
二腥例、Vector3類 (四種)
Vector3?既可以表示三維空間中的一個(gè)點(diǎn),也可以表示一個(gè)向量酝润。
這三個(gè)方法均為插值方法燎竖,?Lerp為線性插值,Slerp為球形插值袍祖,MoveTowards在Lerp的基礎(chǔ)上增加了限制最大速度功能底瓣。
當(dāng)需要從指定A點(diǎn)移動(dòng)到B點(diǎn)時(shí),可以考慮時(shí)候這些方法。
1蕉陋、Vector3.MoveTowards();勻速移動(dòng)到目標(biāo)點(diǎn)
void?Update(){
? ?? ???//參數(shù)1捐凭,自身position。??參數(shù)2凳鬓,目標(biāo)點(diǎn)position茁肠,
? ?? ???//參數(shù)3,移動(dòng)速度缩举,??0不動(dòng)垦梆,>0朝向目標(biāo)移動(dòng),
//<0朝向目標(biāo)點(diǎn)的向量相反方向移動(dòng)仅孩,這時(shí)托猩,物體只有運(yùn)動(dòng)方向,不再有目標(biāo)點(diǎn)
? ?? ???transform.position =?Vector3.MoveTowards(transform.position,?new?Vector3(0, 0, 5), speed *?Time.deltaTime);
}
2辽慕、Vector3.Lerp()京腥;線性插值
void?Update(){
? ?? ???//參數(shù)1,自身position溅蛉。??參數(shù)2公浪,目標(biāo)點(diǎn)position,
? ?? ???//參數(shù)3船侧,移動(dòng)剩余距離的百分比距離 ,賦值范圍(0,1)數(shù)值越大運(yùn)動(dòng)越快
? ?? ???transform.position =?Vector3.Lerp(transform.position,?new?Vector3(0, 0.5f, 20), speed);
}
3欠气、Vector3.Slerp();球形(弧形)插值
void?Update(){
? ?? ???//參數(shù)1镜撩,自身position预柒。??參數(shù)2,目標(biāo)點(diǎn)position袁梗,
? ?? ???//參數(shù)3卫旱,移動(dòng)剩余距離的百分比距離 ,賦值范圍(0,1)數(shù)值越大運(yùn)動(dòng)越快
? ?? ???transform.position =?Vector3.Slerp(transform.position,?new?Vector3(0, 0.5f, 20), speed);
}
注意:因?yàn)椴逯狄苿?dòng)需要不止一幀的時(shí)間才能到達(dá)目標(biāo),所以不要把插值移動(dòng)放到Update中執(zhí)行围段,盡量不要設(shè)置限制條件顾翼。
4、Vector3.SmoothDamp()奈泪;平滑阻尼
該方法是可以平滑的從A逐漸移動(dòng)到B點(diǎn)适贸,并且可以控制速度灸芳,最常見的用法是相機(jī)跟隨目標(biāo)。
public?static?Vector3 SmoothDamp(
Vector3 current, //當(dāng)前物體位置
Vector3 target, //目標(biāo)位置
ref Vector3 currentVelocity, //當(dāng)前速度拜姿,這個(gè)值由你每次調(diào)用這個(gè)函數(shù)時(shí)被修改
//雖然使用ref關(guān)鍵字烙样,不過函數(shù)運(yùn)行時(shí)會(huì)自動(dòng)修改
//一般傳入?yún)?shù)值為0
float smoothTime, //到達(dá)目標(biāo)的大約時(shí)間,較小的值將快速到達(dá)目標(biāo) 蕊肥,數(shù)值越大走的越慢
float maxSpeed = Mathf.Infinity,//選擇允許你限制的最大速度(默認(rèn)為正無窮)
float deltaTime = Time.deltaTime//自上次調(diào)用這個(gè)函數(shù)的時(shí)間(默認(rèn)為Time.deltaTime) );
例如:
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;
? ??Vector3?distance;
? ??public?float?speed;
Vector3 ve;
? ??void?Start(){
? ?? ???distance = transform.position - player.position;
? ??}
? ??void?LateUpdate(){
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, player.position + distance,?ref?ve, 0);
? ??}
}
三谒获、Rigidbody類 (三種)
Rigidbody組件用于模擬物體的物理狀態(tài),比如物體受重力影響壁却,物體被碰撞后的擊飛等等批狱。
注意:
1、關(guān)于Rigidbody的調(diào)用均應(yīng)放在FixedUpdate方法中展东,該方法會(huì)在每一次執(zhí)行物理模擬前被調(diào)用赔硫。
2、使用加速度有兩種方式盐肃,
(1)爪膊、第一是rigid.velocity += transform.forward * 100;
(2)、第二是rigid.AddForce(transform.forward * speed, ForceMode.Acceleration);
1砸王、Rigidbody.velocity?物理速度
設(shè)置剛體速度可以讓物體運(yùn)動(dòng)并且忽略靜摩擦力推盛,這會(huì)讓物體快速從靜止?fàn)顟B(tài)進(jìn)入運(yùn)動(dòng)狀態(tài)。
using?UnityEngine;
public?class?MoveTest?:?MonoBehaviour{
? ??Rigidbody?rigid;
? ??void?Start(){
? ?? ???rigid = GetComponent();
? ??}
? ??void?FixedUpdate(){
? ?? ???//加速運(yùn)動(dòng)
? ?? ???//rigid.velocity += transform.forward * 100;
? ?? ???//瞬間速度
? ?? ???//if (Input.GetKeyDown(KeyCode.Space))
? ?? ???//? ? rigid.velocity = transform.forward * 100;
? ??}
}2谦铃、Rigidbody.AddForce()耘成;添加力
給剛體添加一個(gè)方向的力,這種方式適合模擬物體在外力的作用下的運(yùn)動(dòng)狀態(tài)荷辕。
using?UnityEngine;
public?class?MoveTest?:?MonoBehaviour{
? ??Rigidbody?rigid;
? ??public?float?speed;
? ??void?Start(){
? ?? ???rigid = GetComponent();
? ??}
? ??void?FixedUpdate(){
? ?? ???//添加默認(rèn)類型的力
? ?? ???//rigid.AddForce(transform.forward * speed);
? ?? ???//ForceMode.Acceleration 向剛性物體增加一個(gè)連續(xù)的加速度,忽略它的質(zhì)量件豌。
? ?? ???//rigid.AddForce(transform.forward * speed, ForceMode.Acceleration);
? ?? ???//ForceMode.Force 用它的質(zhì)量疮方,給剛性體增加一個(gè)連續(xù)的力。
? ?? ???//rigid.AddForce(transform.forward * speed, ForceMode.Force);
? ?? ???//ForceMode.Impulse 用它的質(zhì)量茧彤,給剛體增加一個(gè)瞬間的力骡显。
? ?? ???//rigid.AddForce(transform.forward * speed, ForceMode.Impulse);
? ?? ???//ForceMode.VelocityChange 在剛開始的時(shí)候增加一個(gè)瞬時(shí)速度變化,忽略它的質(zhì)量曾掂。
? ?? ???//rigid.AddForce(transform.forward * speed, ForceMode.VelocityChange);
? ??}
}
3惫谤、Rigidbody.MovePosition();移動(dòng)位置
剛體受到物理約束的情況下珠洗,移動(dòng)到指定點(diǎn)溜歪。
using?UnityEngine;
public?class?MoveTest?:?MonoBehaviour{
? ??Rigidbody?rigid;
? ??public?float?speed;
? ??void?Start(){
? ?? ???rigid = GetComponent();
? ??}
void FixedUpdate(){
//移動(dòng)到(0,0,1)的位置
? ?? ???rigid.MovePosition(transform.forward);
? ??}
}
四许蓖、CharacterController類 (兩種)
CharacterController用于控制第一人稱或第三人稱角色的運(yùn)動(dòng)蝴猪,使用這種方式可以模擬人的一些行為调衰,比如限制角色爬坡的最大斜度,步伐的高度等。
1自阱、CharacterController.SimpleMove()嚎莉;
按m/s運(yùn)動(dòng),用于模擬簡單運(yùn)動(dòng)沛豌,并且自動(dòng)應(yīng)用重力趋箩,返回值表示角色當(dāng)前是否著地。
using?UnityEngine;
public?class?MoveTest?:?MonoBehaviour{
? ??CharacterController?character;
public float speed;
? ??void?Start(){
? ?? ???character = GetComponent();
? ??}
? ??void?FixedUpdate(){
? ?? ???character.SimpleMove(transform.forward * speed);
? ??}
}
2加派、CharacterController.Move()叫确;
按幀運(yùn)動(dòng),模擬更復(fù)雜的運(yùn)動(dòng),重力需要通過代碼實(shí)現(xiàn)哼丈,返回值表示角色與周圍的碰撞信息启妹。
using?UnityEngine;
public?class?MoveTest?:?MonoBehaviour{
? ??CharacterController?character;
? ??public?float?speed;
? ??void?Start(){
? ?? ???character = GetComponent();
? ??}
? ??void?FixedUpdate(){
? ?? ???character.Move(transform.forward * speed);
? ??}
}
相機(jī)跟隨:
http://www.manew.com/thread-114711-1-1.html
相機(jī)跟隨一般寫在生命周期LateUpdate中1、最簡單醉旦,無代碼饶米,固定距離,固定視角
最簡單的就是?直接?把主相機(jī)作為Player角色的子物體车胡,并自行固定好相機(jī)的位置和角度
優(yōu)點(diǎn):使用方便
缺點(diǎn):使用不靈活檬输,相機(jī)轉(zhuǎn)動(dòng)死板,體驗(yàn)不好匈棘,相機(jī)瞬間移動(dòng)位置
2丧慈、代碼控制,固定距離主卫,固定視角逃默,對1進(jìn)行改進(jìn)
設(shè)置一個(gè)空的GameObject,并且與Player的旋轉(zhuǎn)和位置保持一致簇搅,然后將主相機(jī)設(shè)置成該GameObject的子對象完域。這種做法和方案1?相似。
using?UnityEngine;
///?
///?創(chuàng)建一個(gè)空物體瘩将,
///?此空物體的位置信息始終與主角的位置信息保持一致吟税,
///?主相機(jī)或主角相機(jī)給此空物體當(dāng)子物體
///?當(dāng)主角死亡時(shí),空物體的位置信息更新為上一幀主角的位置信息
///?
public?class?CameraTest?:?MonoBehaviour{
? ??public?Transform?player;
? ??Vector3?tempPostion;
Quaternion tempRotation;
? ??void?Update(){
? ?? ???if?(player){
? ?? ?? ?? ?transform.position = player.position;
? ?? ?? ?? ?transform.rotation = player.rotation;
? ?? ???}
? ?? ???else{
? ?? ?? ?? ?transform.position = tempPostion;
? ?? ?? ?? ?transform.rotation = tempRotation;
? ?? ???}
? ?? ???tempPostion = player.position;
? ?? ???tempRotation = player.rotation;
? ??}
}(這種做法好處在于?當(dāng)模擬角色死亡倒地的時(shí)候不會(huì)獲取不到人物信息姿现,如果采用方案?1?肠仪,只能是重新創(chuàng)建一個(gè)相機(jī),因?yàn)榻巧沟氐臅r(shí)候备典,子物體相機(jī)也會(huì)視角倒地异旧,所以效率肯定方案2?高)
優(yōu)點(diǎn):使用方便,適合大部分游戲模式
缺點(diǎn):使用不靈活提佣,相機(jī)轉(zhuǎn)動(dòng)死板(強(qiáng)制位移)泽艘,體驗(yàn)不好
3欲险、代碼控制,固定距離匹涮,固定視角天试,直接移動(dòng),不會(huì)旋轉(zhuǎn)
使用代碼獲取到一個(gè)相機(jī)的初始位置與人物之間的差值向量然低,在給相機(jī)賦值時(shí)再用這個(gè)差值向量與人物坐標(biāo)求出相機(jī)的實(shí)時(shí)位置
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;
Vector3 distance;
? ??void?Start(){
? ?? ???distance = transform.position - player.position;
? ??}
? ??void?LateUpdate(){
? ?? ???transform.position = player.position + distance;
? ??}
}
優(yōu)點(diǎn):簡單喜每,方便,
缺點(diǎn):無法一直跟隨角色身后雳攘,適合固定視角游戲
4带兜、代碼控制,固定距離吨灭,固定視角刚照,插值移動(dòng)(因?yàn)閁pdate和LateUpdate刷新率不同,會(huì)有抖動(dòng)現(xiàn)象)
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;
? ??Vector3?distance;
? ??public?float?speed;
? ??void?Start(){
? ?? ???distance = transform.position - player.position;
? ??}
? ??void?LateUpdate(){
? ?? ???transform.position =?Vector3.Lerp(transform.position, player.position + distance,?Time.deltaTime * speed);
? ??}
}
不建議使用
5喧兄、代碼控制无畔,固定距離,固定視角吠冤,平滑阻尼移動(dòng)
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;
? ??Vector3?distance;
? ??public?float?speed;
Vector3 ve;
? ??void?Start(){
? ?? ???distance = transform.position - player.position;
? ??}
? ??void?LateUpdate(){
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, player.position + distance,?ref?ve, 0);
? ??}
}
代碼實(shí)現(xiàn)相機(jī)跟隨物體浑彰,可使用一個(gè)接口函數(shù)Vector3.SmoothDamp()?平滑阻尼。?函數(shù)介紹:隨著時(shí)間的推移拯辙,逐漸改變一個(gè)向量朝向預(yù)期的目標(biāo)(有點(diǎn)類似受阻力減速運(yùn)動(dòng))?在官方的手冊里也有推薦用此函數(shù)來實(shí)現(xiàn)?平滑的相機(jī)跟隨
public?static?Vector3 SmoothDamp(
Vector3 current, //當(dāng)前物體位置
Vector3 target, //目標(biāo)位置
ref Vector3 currentVelocity, //當(dāng)前速度郭变,這個(gè)值由你每次調(diào)用這個(gè)函數(shù)時(shí)被修改
//雖然使用ref關(guān)鍵字,不過函數(shù)運(yùn)行時(shí)會(huì)自動(dòng)修改
//一般傳入?yún)?shù)值為0
float smoothTime, //到達(dá)目標(biāo)的大約時(shí)間涯保,較小的值將快速到達(dá)目標(biāo)
float maxSpeed = Mathf.Infinity,//選擇允許你限制的最大速度(默認(rèn)為正無窮)
float deltaTime = Time.deltaTime//自上次調(diào)用這個(gè)函數(shù)的時(shí)間(默認(rèn)為Time.deltaTime) );
6诉濒、代碼控制,固定距離夕春,跟隨主角視角未荒,平滑阻尼移動(dòng),看向主角
要使相機(jī)始終跟隨主角身后撇他,就要始終更新相機(jī)的位置在主角的Y軸后面茄猫,于是手動(dòng)設(shè)置設(shè)置相機(jī)相對于主角的距離
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;? ??//角色位置信息
? ??Vector3?off;? ?? ?? ?? ?? ??//相機(jī)目標(biāo)點(diǎn)位置信息
? ??Vector3?ve;? ?? ?? ?? ?? ???//平滑阻尼的返回值
? ??Quaternion?angel;? ?? ?? ???//相機(jī)看向目標(biāo)的旋轉(zhuǎn)值
? ??public?float?hight;? ?? ?? ?//相機(jī)的高度
public float foward;? ?? ???//相機(jī)在角色后的距離
? ??void?LateUpdate(){
? ?? ???off = player.position + hight * player.up - foward * player.forward;
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, off,?ref?ve, 0);
? ?? ???transform.LookAt(player.position);
? ??}
}
這樣的注視狈蚤,相機(jī)移動(dòng)還是太快
7困肩、代碼控制,固定距離脆侮,平滑的旋轉(zhuǎn)相機(jī)锌畸,平滑阻尼移動(dòng),看向主角
using?UnityEngine;
public?class?CameraTest2?:?MonoBehaviour{
? ??public?Transform?player;? ??//角色位置信息
? ??Vector3?off;? ?? ?? ?? ?? ??//相機(jī)目標(biāo)點(diǎn)位置信息
? ??public?float?speed;? ?? ?? ?//相機(jī)移動(dòng)速度
? ??Vector3?ve;? ?? ?? ?? ?? ???//平滑阻尼的返回值
? ??Quaternion?angel;? ?? ?? ???//相機(jī)看向目標(biāo)的旋轉(zhuǎn)值
? ??public?float?hight;? ?? ?? ?//相機(jī)的高度
? ??public?float?foward;? ?? ???//相機(jī)在角色后的距離
? ??void?LateUpdate(){
? ?? ???off = player.position + hight * player.up - foward * player.forward;
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, off,?ref?ve, 0);
//看向向量指向的方向
? ?? ???angel =?Quaternion.LookRotation(player.position - off);
? ?? ???transform.rotation =?Quaternion.Slerp(transform.rotation, angel,?Time.deltaTime * speed);
? ??}
}
8靖避、代碼控制潭枣,固定距離比默,平滑的旋轉(zhuǎn)相機(jī),平滑阻尼移動(dòng)盆犁,看向主角命咐,有物體遮擋(方法一)
using?UnityEngine;
///?
///?相機(jī)進(jìn)行射線檢測,如果檢測不到主角谐岁,
///?就在起始點(diǎn)與結(jié)束點(diǎn)(主角頭頂?shù)囊粋€(gè)點(diǎn))之間尋找?guī)讉€(gè)點(diǎn)醋奠,
///?直到找到可以看到主角的點(diǎn)
///?
public?class?CameraTest2?:?MonoBehaviour
{
? ??public?Transform?player;? ??//角色位置信息
? ??Vector3[]?v3;? ?? ???//相機(jī)自動(dòng)找尋的位置點(diǎn)
? ??public?int?num;? ?? ?? ?? ??//相機(jī)臨時(shí)點(diǎn)的個(gè)數(shù)
? ??public?Vector3?start;? ?? ??//相機(jī)開始時(shí)的位置
? ??public?Vector3?end;? ?? ?? ?//相機(jī)沒有找到主角時(shí)的位置
? ??Vector3?tagetPostion;? ?? ??//相機(jī)看向的目標(biāo)點(diǎn)
? ??Vector3?ve3;? ?? ?? ?? ?? ??//平滑阻尼的ref參數(shù)
? ??Quaternion?angel;? ?? ?? ???//相機(jī)看向目標(biāo)的旋轉(zhuǎn)值
? ??public?float?speed;? ?? ?? ?//相機(jī)移動(dòng)速度
? ??void?Start()
? ??{
? ?? ???//外界賦值數(shù)組長度
? ?? ???v3 =?new?Vector3[num];
? ??}
? ??void?LateUpdate()
? ??{
? ?? ???//記錄相機(jī)初始位置
? ?? ???start = player.position + player.up * 2.0f - player.forward * 3.0f;
? ?? ???//記錄相機(jī)最終位置
? ?? ???end = player.position + player.up * 5.0f;
? ?? ???//相機(jī)目標(biāo)位置,開始等于初始位置
? ?? ???tagetPostion = start;
? ?? ???v3[0]?= start;
? ?? ???v3[num - 1]?= end;
? ?? ???//動(dòng)態(tài)獲取相機(jī)的幾個(gè)點(diǎn)
? ?? ???for?(int?i = 1; i < num; i++)
? ?? ???{
? ?? ?? ?? ?v3[i]?=?Vector3.Lerp(start, end, i / num);
? ?? ???}
? ?? ???//判斷相機(jī)在那個(gè)點(diǎn)可以看到主角
? ?? ???for?(int?i = 0; i < num; i++)
? ?? ???{
? ?? ?? ?? ?if?(Function(v3[i]))
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? tagetPostion = v3[i];
? ?? ?? ?? ?? ??break;
? ?? ?? ?? ?}
? ?? ?? ?? ?if?(i == num - 1)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? tagetPostion = end;
? ?? ?? ?? ?}
? ?? ???}
? ?? ???//主角的移動(dòng)和看向
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, tagetPostion,?ref?ve3, 0);
? ?? ???angel =?Quaternion.LookRotation(player.position - tagetPostion);
? ?? ???transform.rotation =?Quaternion.Slerp(transform.rotation, angel, speed);
? ??}
? ??///?
? ??///?射線檢測伊佃,相機(jī)是否能照到主角
? ??///?
? ??///?計(jì)算射線發(fā)射的方向
? ??///?是否檢測到
? ??bool?Function(Vector3?v3)
? ??{
? ?? ???RaycastHit?hit;
? ?? ???if?(Physics.Raycast(v3, player.position - v3,?out?hit))
? ?? ???{
? ?? ?? ?? ?if?(hit.collider.tag ==?"Player")
? ?? ?? ?? ?{
? ?? ?? ?? ?? ??return?true;
? ?? ?? ?? ?}
? ?? ???}
? ?? ???return?false;
? ??}
}
9窜司、代碼控制,固定距離航揉,平滑的旋轉(zhuǎn)相機(jī)塞祈,平滑阻尼移動(dòng),看向主角帅涂,有物體遮擋(方法二)
using?UnityEngine;
///?
///?從主角發(fā)射射線檢測相機(jī)的位置
///?檢測不到议薪,就把相機(jī)移動(dòng)到,射線的碰撞點(diǎn)的前面
///?
public?class?CameraTest2?:?MonoBehaviour
{
? ??public?Transform?player;? ?? ?? ?? ?//角色頭部(設(shè)置空物體)位置信息
? ??private?Vector3?tagetPostion;? ?? ??//相機(jī)看向的目標(biāo)點(diǎn)
? ??private?Vector3?ve3;? ?? ?? ?? ?? ??//平滑阻尼的ref參數(shù)
? ??Quaternion?angel;? ?? ?? ?? ?? ?? ??//相機(jī)看向目標(biāo)的旋轉(zhuǎn)值
? ??public?float?speed;? ?? ?? ?? ?? ???//相機(jī)移動(dòng)速度
? ??public?float?upFloat;? ?? ?? ?? ?? ?//Y軸上升距離
? ??public?float?backFloat;? ?? ?? ?? ??//Z軸與主角的距離
? ??void?LateUpdate()
? ??{
? ?? ???//記錄相機(jī)初始位置
? ?? ???tagetPostion = player.position + player.up * upFloat - player.forward * backFloat;
? ?? ???[size=12.6667px]//刷新相機(jī)目標(biāo)點(diǎn)的坐標(biāo)
? ?? ???tagetPostion = Function(tagetPostion);
? ?? ???//主角的移動(dòng)和看向
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, tagetPostion,?ref?ve3, 0);
? ?? ???angel =?Quaternion.LookRotation(player.position - tagetPostion);
? ?? ???transform.rotation =?Quaternion.Slerp(transform.rotation, angel, speed);
? ??}
? ??///?
? ??///?射線檢測漠秋,主角向后檢測是否有相機(jī)跟隨
? ??///?
? ??///?用來計(jì)算射線發(fā)射的方向
? ??///?是否檢測到
? ??Vector3?Function(Vector3?v3)
? ??{
? ?? ???RaycastHit?hit;
? ?? ???if?(Physics.Raycast(player.position, v3 - player.position,?out?hit, 5.0f))
? ?? ???{
? ?? ?? ?? ?if?(hit.collider.tag !=?"MainCamera")
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? v3 = hit.point + transform.forward * 0.5f;
? ?? ?? ?? ?}
? ?? ???}
? ?? ???return?v3;
? ??}
}
10笙蒙、代碼控制,固定距離庆锦,平滑的旋轉(zhuǎn)相機(jī)捅位,平滑阻尼移動(dòng),看向主角搂抒,有物體遮擋艇搀,結(jié)合手游中相機(jī)的旋轉(zhuǎn)和復(fù)位
using?UnityEngine;
///?
///?相機(jī)進(jìn)行射線檢測,如果檢測不到主角求晶,
///?就在起始點(diǎn)與結(jié)束點(diǎn)之間尋找?guī)讉€(gè)點(diǎn)焰雕,
///?直到找到可以看到主角的點(diǎn)
/// 在游戲中玩家可以用鼠標(biāo)控制相機(jī)的旋轉(zhuǎn)
///?
public?class?CameraTest2?:?MonoBehaviour
{
? ??public?Transform?player;? ??//角色位置信息
? ??Vector3[]?v3;? ?? ???//相機(jī)自動(dòng)找尋的位置點(diǎn)
? ??public?int?num;? ?? ?? ?? ??//相機(jī)臨時(shí)點(diǎn)的個(gè)數(shù)
? ??public?Vector3?start;? ?? ??//相機(jī)開始時(shí)的位置
? ??public?Vector3?end;? ?? ?? ?//相機(jī)沒有找到主角時(shí)的位置
? ??Vector3?tagetPostion;? ?? ??//相機(jī)看向的目標(biāo)點(diǎn)
? ??Vector3?ve3;? ?? ?? ?? ?? ??//平滑阻尼的ref參數(shù)
? ??Quaternion?angel;? ?? ?? ???//相機(jī)看向目標(biāo)的旋轉(zhuǎn)值
? ??public?float?speed;? ?? ?? ?//相機(jī)移動(dòng)速度
? ??void?Start()
? ??{
? ?? ???//外界賦值數(shù)組長度
? ?? ???v3 =?new?Vector3[num];
? ??}
? ??void?LateUpdate()
? ??{
? ?? ???//記錄相機(jī)初始位置
? ?? ???start = player.position + player.up * 2.0f - player.forward * 3.0f;
? ?? ???//記錄相機(jī)最終位置
? ?? ???end = player.position + player.up * 5.0f;
? ?? ???//鼠標(biāo)控制相機(jī)的旋轉(zhuǎn)
? ?? ???if?(Input.GetMouseButton(1))
? ?? ???{
? ?? ?? ?? ?//記錄相機(jī)的初始位置和旋轉(zhuǎn)角度
? ?? ?? ?? ?Vector3?pos = transform.position;
? ?? ?? ?? ?Vector3?rot = transform.eulerAngles;
? ?? ?? ?? ?//讓相機(jī)繞著指定軸向旋轉(zhuǎn)
? ?? ?? ?? ?transform.RotateAround(transform.position,?Vector3.up,?Input.GetAxis("Mouse X")?* 10);
? ?? ?? ?? ?transform.RotateAround(transform.position,?Vector3.left, -Input.GetAxis("Mouse Y")?* 10);
? ?? ?? ?? ?//限制相機(jī)的繞X旋轉(zhuǎn)的角度
? ?? ?? ?? ?if?(transform.eulerAngles.x < -60 || transform.eulerAngles.x > 60)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? transform.position = pos;
? ?? ?? ?? ?? ? transform.eulerAngles = rot;
? ?? ?? ?? ?}
? ?? ?? ?? ?return;
? ?? ???}
? ?? ???//相機(jī)目標(biāo)位置,開始等于初始位置
? ?? ???tagetPostion = start;
? ?? ???v3[0]?= start;
? ?? ???v3[num - 1]?= end;
? ?? ???//動(dòng)態(tài)獲取相機(jī)的幾個(gè)點(diǎn)
? ?? ???for?(int?i = 1; i < num; i++)
? ?? ???{
? ?? ?? ?? ?v3[i]?=?Vector3.Lerp(start, end, i / num);
? ?? ???}
? ?? ???//判斷相機(jī)在那個(gè)點(diǎn)可以看到主角
? ?? ???for?(int?i = 0; i < num; i++)
? ?? ???{
? ?? ?? ?? ?if?(Function(v3[i]))
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? tagetPostion = v3[i];
? ?? ?? ?? ?? ??break;
? ?? ?? ?? ?}
? ?? ?? ?? ?if?(i == num - 1)
? ?? ?? ?? ?{
? ?? ?? ?? ?? ? tagetPostion = end;
? ?? ?? ?? ?}
? ?? ???}
? ?? ???//主角的移動(dòng)和看向
? ?? ???transform.position =?Vector3.SmoothDamp(transform.position, tagetPostion,?ref?ve3, 0);
? ?? ???angel =?Quaternion.LookRotation(player.position - tagetPostion);
? ?? ???transform.rotation =?Quaternion.Slerp(transform.rotation, angel, speed);
? ??}
? ??///?
? ??///?射線檢測芳杏,相機(jī)是否能照到主角
? ??///?
? ??///?計(jì)算射線發(fā)射的方向
? ??///?是否檢測到
? ??bool?Function(Vector3?v3)
? ??{
? ?? ???RaycastHit?hit;
? ?? ???if?(Physics.Raycast(v3, player.position - v3,?out?hit))
? ?? ???{
? ?? ?? ?? ?if?(hit.collider.tag ==?"Player")
? ?? ?? ?? ?{
? ?? ?? ?? ?? ??return?true;
? ?? ?? ?? ?}
? ?? ???}
? ?? ???return?false;
? ??}
}