[Unity3D] 物體移動(dòng)與相機(jī)跟隨

物體移動(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;

? ??}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矩屁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子爵赵,更是在濱河造成了極大的恐慌吝秕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件空幻,死亡現(xiàn)場離奇詭異烁峭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門约郁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缩挑,“玉大人,你說我怎么就攤上這事鬓梅」┲茫” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵绽快,是天一觀的道長士袄。 經(jīng)常有香客問我,道長谎僻,這世上最難降的妖魔是什么娄柳? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮艘绍,結(jié)果婚禮上赤拒,老公的妹妹穿的比我還像新娘。我一直安慰自己诱鞠,他們只是感情好挎挖,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著航夺,像睡著了一般蕉朵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阳掐,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天始衅,我揣著相機(jī)與錄音,去河邊找鬼缭保。 笑死汛闸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艺骂。 我是一名探鬼主播诸老,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钳恕!你這毒婦竟也來了别伏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤忧额,失蹤者是張志新(化名)和其女友劉穎厘肮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宙址,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轴脐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年调卑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡砂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片大咱。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖注益,靈堂內(nèi)的尸體忽然破棺而出碴巾,到底是詐尸還是另有隱情,我是刑警寧澤丑搔,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布厦瓢,位于F島的核電站,受9級特大地震影響啤月,放射性物質(zhì)發(fā)生泄漏煮仇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一谎仲、第九天 我趴在偏房一處隱蔽的房頂上張望浙垫。 院中可真熱鬧,春花似錦郑诺、人聲如沸夹姥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辙售。三九已至,卻和暖如春飞涂,著一層夾襖步出監(jiān)牢的瞬間旦部,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工较店, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留志鹃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓泽西,卻偏偏與公主長得像曹铃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子捧杉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容