當前位置:首頁 » 編程軟體 » unity旋轉腳本

unity旋轉腳本

發布時間: 2023-04-05 21:48:49

① 在unity中把旋轉的腳本付給物體就出錯是在怎麼回事

錯誤攜橘原因:對象沒含嘩有初始化
Find沒有找到對象.所以你update的時候對這個sun操作不了。
是你的腳本拉到攝像機之後,因為是public gameobject 。所以你可以在場景中直接將物體拉到攝像機腳本下的 sun變數進行綁定。
問題解決。談隱行

② Unity基礎-Transform

任何游戲對象在創建的時候都會附帶Transform組件,用於儲存並操控物體的位置、旋轉和縮放。

並且該組件是無法刪除的。

Transform面板一共包含3個屬性:

Position:位置

Rotation:旋轉

Scale:(縮放)

可修改對象的位置、旋轉方式、縮放數值

position;世界坐標系位置

localPosition;本地坐標系位置

縮放

localScale;自身縮放

lossyScale;全局縮放

旋轉

transform.rotation;世界坐標系旋轉

transform.localRotation;本地坐標系旋轉

transform.eulerAngles;世界坐標系旋轉

transform.localEulerAngles;本地坐標系旋轉

歐拉角

構件在三維空間中的有限轉動,可依次用三個相對轉角表示這三個轉角統稱為歐拉角。

unity中的歐褲仿御拉角有兩種方式可以解釋:

1,當認為順序是yxz時(其實就是heading - pitch - bank),是傳統的歐拉角變換,也就是以物體自己的坐標系為軸的。

2,當認為順序是zxy時(roll - pitch - yaw),也是官方文檔的順序時,是以慣性坐標系為軸的。後者比較直觀一些,但其實兩者的實際效果是一樣的,只是理解不一樣。

歐拉角有兩種:

靜態:即繞世界坐標系三個軸的旋轉,由於物體旋轉過程中坐標軸保持靜止,所以稱為靜態。

動態:即繞物體坐標系三個軸的旋轉,由於物體旋轉過程中坐標軸隨著物體做相同的轉動,所以稱為動態。

使用動態歐拉角會出現萬向鎖現象;靜態歐拉角不存在萬向大答鎖的問題

正常狀態:三個獨立的旋轉軸

萬向鎖:一旦選擇±90°作為pitch角,就會導致第一次旋轉和第三次旋轉等價,整個旋轉表示系統被限制在只能繞豎直軸旋轉,丟失了一個表示維度。

萬向節死鎖會導致位置上連續變化,在數值表示上確是非連續的。給定的兩個關鍵幀之間無法平滑過渡。解決方法:可以使用四元數球面線性插值

四元數

愛爾蘭數學家William hamilton一直致力於尋找一種方法將復數2D擴展到3D他認為,新的復數應該有一個實部和兩個虛部。但是一直沒有成功。1843年,他在前往愛爾蘭學院演講的路上,突然意識到應該有三個虛部而不是兩個。他把這種新復數類型性質刻在了橋上,這就是四元數。

四元數使用四個數來表達方位,因此命名為四元數用三個數來表達3D方位,一定會導致萬向鎖的問題。一個四元數包含一個標量分量和一個3D向量分量。通常標量分量為w,向量分量為v或者分開的x,y,z.

記法:[w,v][w,(x,y,z)]四元數與復數:復數定義: a+bi, i是所謂的虛數,滿足 i的平方等於-1;a是實部,b是虛部。

四元數擴展了復數系統,使用了三個虛部i,j,k一個四元數[w,(x,y,z)]定義了復數 w+xi+yj+zk.很多標准復數的性質都能應用到四元數上。更重要的是,和復數來旋轉2D中的向量類似,四元數也能用來旋轉3D中的向量。

四元數是非常重要的工具類之一。在Unity中所有用到模型旋轉的,其底層都是由四元數實現的,它可以精確的胡岩計算模型旋轉的角度。Quaternion基於復數的表示並不容易被直觀地理解,因此沒有必要訪問或修改單個Quaternion組件(x,y,z,w)只需通過Transform的rotation來實現旋轉,或者構造新的旋轉,如在兩個旋轉間平滑地插值

eulerAngles屬性返回表示旋轉的歐拉角度。表示旋轉的角度,順序依次繞z軸旋轉euler.z度,繞x軸旋轉euler.x度,繞y軸旋轉euler.y度範例:創建一個旋轉,繞y軸,指定一個30度旋轉角

在unity3d中,用四元數來表示旋轉,四元數英文名叫quaternion . 比如 transform.rotation 就是一個四元數,其由四個部分組成

Quaternion = (xi + yj + zk + w ) = (x,y,z,w)

quaternion 中 (x,y,z) 跟旋轉軸有關, w 與繞旋轉軸旋轉的角度有關,因為它們都要經過代數運算才能得出旋轉軸和旋轉角度  

Unity3D 中 用quaternion 來對一個坐標點進行旋轉,我進行的是第2種操作,即對一個向量進行旋轉;

首先 ,Quaternion 的基本數學方程為 :

Q = cos (a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k(z * sin(a/2))    (a 為旋轉角度)

Q.w = cos (angle / 2) 

Q.x = axis.x * sin (angle / 2) 

Q.y = axis.y * sin (angle / 2)  

Q.z = axis.z * sin (angle / 2)

我們只要有角度就可以給出四元數的四個部分值,例如我想要讓點M=Vector3(o,p,q) 繞x軸順時針旋轉90度;那麼對應的quaternion數值就應該為:

Q : Quaternion;

Q.x = 1 * sin(90度/2) = sin(45度) = 0.7071

Q.y = 0;

Q.z = 0;

Q.w = cos(90度/2) = cos (45度) = 0.7071

Q = (0.7071, 0 , 0 , 0.7071);

m = Q * m;(將點m 繞 x軸(1,0,0) 順時針旋轉了90度)

示例:

using UnityEngine;

using System.Collections;

class EulerAnglesTest: MonoBehaviour 

{

  public Quaternion rotation = Quaternion.identity;

  public void Awake() {   

     rotation.eulerAngles = new Vector3(0, 30, 0); 

    transform.rotation = rotation;

 }

}

Translate

移動transform在translation的方向和距離。

Space.Self和Space.World

注意,vector.forward和tranform.forward區別

Debug.Log("****************************");

Debug.Log(Vector3.forward);

Debug.Log(Vector3.right);

Debug.Log(Vector3.up);

Debug.Log("****************************");

Debug.Log(transform.forward);

Debug.Log(transform.right);

Debug.Log(transform.up);

Rotate

Transform.Rotate 旋轉

Transform.RotateAround 圍繞旋轉

LookAt

盯著看

transform.LookAt(Transform target);

transform.LookAt(Vector3 worldPosition);

擴展

transform.LookAt(Transform target,Vector3 worldUp);

z軸指向目標後,y軸旋轉變換指向由worldUp向量暗示的方向。 如果省略worldUp參數,該函數將使用世界y軸。 worldUp只是一個提示矢量。

Find:通過名字查找子物體並返回它。如果沒有查找到子物體名字,將返回null。如果名字包含「/」字元它將向路徑一樣穿越層次。

GetChild():根據子節點的序列查找子物體。

Transform維護父子關系

Transform.root 根

Transform.parent 父級

Transform.childCount 子物體數

Transform.SetParent();設置父節點

Transform.DetachChildren 分離子物體

坐標系變換

TransformPoint:變換位置從物體坐標到世界坐標

InverseTransformPoint:變換位置從世界坐標到自身坐標

TransformDirection:將一個方向從局部坐標變換到世界坐標方向。

InverseTransformDirection:將一個方向從世界坐標變換到局部坐標方向。

(擴展)矩陣(Matrix)

一個標準的4x4變換矩陣。

一個變換矩陣可以執行任意的線形3D變換(例如,平移,旋轉,縮放,切變等等)

並且透視變換使用齊次坐標。腳本中很少使用矩陣:最常用Vector3,Quaternion,而且Transform類的功能更簡單。

單純的矩陣用於特殊情況,如設置非標准相機投影在Unity中,Matrix4x4被Transform,Camera,Material和GL幾個函數使用。

worldToLocalMatrix:矩陣變換的點從世界坐標轉為自身坐標(只讀)。

localToWorldMatrix:矩陣變換的點從自身坐標轉為世界坐標(只讀)。

Debug.Log(tran

sform.position);

Debug.Log(transform.localPosition);

Vector4 vec = new Vector4(transform.localPosition.x,transform.localPosition.y,transform.localPosition.z,1);

Debug.Log((transform.parent.localToWorldMatrix*vec));

Vector4 vec2=new Vector4(transform.position.x,transform.position.y,transform.position.z,1); 

Debug.Log(transform.parent.worldToLocalMatrix*vec2);

③ Unity3D製作簡易坦克旋轉發射子彈

項目:製作一個坦克,讓它在旋轉的同時發射子彈,並且讓它在兩秒之後銷毀

問題:1.子彈怎麼連續產生?

答:拖成預設體

2.子彈怎麼停留兩秒後銷毀

答:用Destroy();放在Start函數中,每次產生新子彈之前把之前銷毀之前的子彈

解析:

1.創建一個簡易的坦克唯友,裡麵包含以下對象(還有一個子彈模型,拖成預設體)

GameObject這個空物體是發射子彈的地方,如圖示

注意:要想子彈發射的方向跟炮筒Cylinder的方向一致,必須將子彈和GameObject的rotation都設成跟炮筒Cylinder的一樣

2.創建一個FlyScript腳本掛在子彈身上,實現子彈的發射和銷毀

usingSystem.Collections;

usingSystem.Collections.Generic;

usingUnityEngine;

publicclassFlyScript:MonoBehaviour

{

voidStart()

{

//每產生一個新子彈之前,進行一次銷毀的慎山簡操作,每2秒銷毀一個子彈

Destroy(gameObject,2f);

}

voidUpdate()

{

//發射子彈,transform.up是自身方向的y軸,加上Space.World後就是相對於世界坐標的方向

transform.Translate(transform.up,Space.World);

}

}

3.創建一個腳本掛在GameObject(即發射口)上實現子彈連續不斷的產生

將子彈bullets預設體拖寬褲動這里

usingSystem.Collections;

usingSystem.Collections.Generic;

usingUnityEngine;

publicclassTankScript:MonoBehaviour

{

//子彈

publicGameObjectbullets;

//計時器

privatefloattimer;

voidUpdate()

{//每一秒產生一顆子彈

timer+=Time.deltaTime;

if(timer>=1f){

timer=0;

Instantiate(bullets,transform.position,transform.rotation);

}

}

}

4.創建一個腳本掛在Tank身上實現坦克的勻速旋轉

usingSystem.Collections;

usingSystem.Collections.Generic;

usingUnityEngine;

publicclassRotateScript:MonoBehaviour

{

voidUpdate()

{

//使得坦克勻速旋轉

transform.Rotate(0,5*Time.deltaTime,0);

}

}

④ unity 如何讓物體繞自己的中心軸轉

1、打開unity3d在場景中創建一個球體。

⑤ Unity3d按住按鈕物體旋轉松開停止腳本怎麼寫

mouseenter 和 mouseexit就行了,不用按住。檢測滑鼠在物體上,就旋轉,滑鼠離開就停止

⑥ unity中如何讓物體以一定速度沿y軸旋轉90度

1,你可以做判斷,用transform.Rotate,當轉過90度後停止旋轉
2,用四元數的插值運算transform.rotation
=
Quaternion.Lerp(from.rotation,
to.rotation,
Time.time
*
speed);from.rotation在start獲取一下當前的rotation,to.rotation就是旋轉90度後的rotation

⑦ unity 手指旋轉角色的功能

1.1 可以用手指進行旋轉。
1.2 點擊角色時可以觸發事件

在需要檢測的物體上 首先物體要有Collider 添加腳本 使用OnMouse系列方法(腳本的enable不影響OnMouse的調用)

先說一下 有哪些封裝好的公共方法

然後說一下使用方法

1.通過編輯器中添加

在Inspector中添加EventTrigger的componnent組件,然後點擊Add New Event Type按鈕添加一個基本的事件

當我們選擇一個事件的時候,就相當於將要於此事件綁定了,例如當我們選擇Pointer Click的時候,綁定了這個組件的物體將接受Pointer Click 事件的消息,當我們在物體上按下滑鼠的時候,(當然空間中的物體我們是無法通過滑鼠點擊的,但是當我們可以通過射線碰撞的方法,來實現Pointer Enter,Pointer Exit等事件的觸發)這里我們用來綁定這個EventTrigger 的是一個UI Panel 這樣便可以讓它接受我們自定義的單擊事件了

最後 別忘了 在攝像機下添加一個Physics Raycaster的組件,用來檢測滑鼠射線

考慮到以後的擴展,我們使用第三種方式來實現具體的功能。

將腳本掛到要旋轉的物體上就可以進行旋轉了。

效果如下圖:

⑧ unity,按下空格健,物體旋轉x軸旋轉30度,定在30度不動,松開空格健物體回到0度,腳本怎麼寫

void Update()
{
if (Input.GetKey(KeyCode.Space))
{
if (transform.localEulerAngles.x < 30)
this.transform.Rotate(new Vector3(1, 0, 0), 5f * Time.deltaTime);
else
this.transform.localEulerAngles = new Vector3(30,0,0);
}
else
{
if (transform.localEulerAngles.x > 0 && transform.localEulerAngles.x <= 30)
this.transform.Rotate(new Vector3(-1, 0, 0), 5f * Time.deltaTime);
else
this.transform.localEulerAngles = new Vector3(0, 0, 0);
}
}

熱點內容
頁面演算法操作系統 發布:2025-07-15 23:35:30 瀏覽:128
程序加密專家 發布:2025-07-15 23:28:13 瀏覽:486
別克君威15t怎麼選配置 發布:2025-07-15 23:26:52 瀏覽:509
游戲分流解壓 發布:2025-07-15 23:24:20 瀏覽:161
C語言中撤銷 發布:2025-07-15 23:24:18 瀏覽:582
常見網頁編程 發布:2025-07-15 23:20:16 瀏覽:115
投資經理編程 發布:2025-07-15 23:04:06 瀏覽:639
本地伺服器讓外網訪問 發布:2025-07-15 23:02:49 瀏覽:399
ftp掃描器 發布:2025-07-15 23:01:45 瀏覽:48
安卓手機數據保存在哪個文件夾 發布:2025-07-15 23:01:06 瀏覽:763