Unity筆記(三)——父子關系、坐標轉換、Input、屏幕

寫在前面

寫本系列的目的(自用)是回顧已經學過的知識、記錄新學習的知識或是記錄心得理解,方便自己以后快速復習,減少遺忘。這里只有部分語法知識。

九、父子關系

1、獲取、設置父對象

(1)獲取父對象

可以通過this.transform.parent獲取當前對象的父對象Transform組件,通過this. transform. parent. name直接獲取父對象名稱

    void Start(){print(this.transform.parent.name);}

輸出:?

(2)設置父對象?

若是要“斷絕父子關系”,移除父對象

可以直接賦空:this.transform.parent = null

或者使用API:this.transform.SetParent(null)

執行效果如下:

設置父子關系,同樣的使用API:

this.transform.SetParent(GameObject.Find("father").transform);

直接在SetParent()中傳入目標對象的transform即可。這里需要提SetParent()的第二個參數,第二個參數為worldPositionStays

如果填true:?保持世界坐標(默認)

如果填false:直接采?本地坐標?

現在看一個示例:當前目標父對象transform信息為

?子對象(還未掛到父對象下)信息為:

運行代碼:

    void Start(){this.transform.SetParent(GameObject.Find("father").transform,true);}

子對象當前信息如下,可見原世界信息沒有改變,inspector信息修改為了與父對象的相對信息

如果運行代碼為:

    void Start(){this.transform.SetParent(GameObject.Find("father").transform,false);}

?子對象當前信息如下,inspector信息沒變:

但解開父子關系后,子對象世界信息發生改變:

?2、獲取、設置子對象

(1)移除所有子對象

使用this.transform.DetachChildren()斷絕與所有直接子對象的關系,不影響孫子對象;所有?對象變為場景根節點的子對象,位置/旋轉/縮放保持原世界坐標值

例如,這是原來的關系:

執行:

    void Start(){this.transform.DetachChildren();}

(2)獲取子對象

按名查找:使?this.transform.Find("子對象名"),可以找到失活對象

獲取子對象數量:this.transform.childCount

按索引獲取子對象:this.transform.GetChild(索引),索引超范圍會報錯

如下例,此時有11個子對象:

我們可以查找里面任意一個子對象,也可以直接遍歷輸出子對象的名字:?

void Start()
{print(this.transform.Find("son").name);for(int i = 0; i < this.transform.childCount;i++){print(this.transform.GetChild(i).name);}
}

?部分輸出:

3、兒子的操作

這些都是固定的API,記住即可?

(1)判斷當前對象是否是自己的父對象

使用this.transform.IsChildOf()判斷當前對象是否是另?個對象的子對象。參數傳入父對象的transform。返回值是bool值。

    public Transform son;void Start(){print(son.transform.transform.IsChildOf(this.transform));}

(2)編號相關?

可以用GetSiblingIndex()獲得自己作為兒子的編號,SetAsFirstSibling()將當前對象設置為第一個兒子

void Start()
{print(son.GetSiblingIndex());son.SetAsFirstSibling();
}

?運行結果:

?除此之外,還可以將自己設置為最后一個兒子、設置為指定編號的兒子:

    son.SetAsLastSibling();son.SetSiblingIndex(5);

?需要注意的是,編號超出范圍自動設置為最后一個兒子。

十、 坐標轉換

1、世界坐標系轉本地坐標系

世界坐標系轉本地坐標系,可以幫助我們大概判斷相對位置

(1)世界坐標系的點轉換為相對本地坐標系的點

該轉換方式受縮放影響。一般來講,當立方體縮放為(2,2,2)時,轉換結果會縮小為原值的1/2;縮放為(0.5,0.5,0.5)時,結果會放大為原值的2倍。

void Start()
{print(Vector3.forward);print("轉換后的點:" + this.transform.InverseTransformPoint(Vector3.forward));
}

這里由于掛載的對象位置坐標就是?001,因此Vector3.forward以當前對象坐標為原點建立坐標系時,轉換后為000

(2)世界坐標系的方向轉換為相對于本地坐標系的方向

有受縮放影響和不受縮放影響,如下:

void Start()
{//不受print("轉換后的方向:" + this.transform.InverseTransformDirection(Vector3.forward));//受print("受縮放影響轉換后的方向:"+this.transform.TransformVector(Vector3.forward));
}

2、本地坐標系轉世界坐標系

(1)本地坐標系的點轉換為相對世界坐標系的點

受縮放影響

void Start()
{print(Vector3.forward);print("轉換后的點:" + this.transform.TransformPoint(Vector3.forward));
}

(2)本地坐標系的方向轉換為相對于世界坐標系的方向

有受縮放影響和不受縮放影響,如下:

void Start()
{print("轉換后的方向:"+this.transform.TransformDirection(Vector3.forward));print("受縮放影響轉換后的方向:" + this.transform.TransformVector(Vector3.forward)); 
}

十一、input輸入相關

1、檢測鼠標

(1)鼠標在屏幕上的位置

屏幕坐標的原點在屏幕的左下角, 往右是x軸正方向,往上是y軸正方向。屏幕是2D的,不存在z軸,所以z軸一直都是0。獲取鼠標位置使用Input.mousePosition

    void Update(){print(Input.mousePosition);}

當鼠標一直在屏幕上動時,就會打印出鼠標位置:

(2)檢測鼠標輸入

鼠標的按鍵編號是:0代表左鍵、1代表右鍵、3代表中鍵。

若是想進行按下檢測,也就是鼠標按下的一瞬間 進入,需要使用:Input.GetMouseButtonDown() ,里面傳入0、1、2就可以分別檢測左鍵、右鍵、中鍵

    void Update(){if(Input.GetMouseButtonDown(0)){print("鼠標左鍵按下");}}

若是想進行抬起檢測,也就是鼠標抬起的一瞬間 進入,需要使用:Input.GetMouseButtonUp()

void Update()
{if(Input.GetMouseButtonUp(1)){print("鼠標右鍵抬起");}
}

鼠標長按按下抬起都會進入,當按住按鍵不放時,會一直處于這個判斷

void Update()
{if(Input.GetMouseButton(0)){print("鼠標左鍵長按");}
}

以上需要注意的是,?Down/Up只在動作發?的瞬間觸發?次,長按會一直處于這個判斷,不停打印。?

最后是中鍵滾動,使用Input.mouseScrollDelta可以獲取中鍵滾動的Vector2值。

中鍵滾動改變y值,若是0就是未滾動狀態,向上滾動為正,向下滾動為負

print(Input.mouseScrollDelta);

2、檢測鍵盤

鍵盤同樣有三種狀態、按下、抬起、長按。

(1)鍵盤按下

檢測鍵盤按下方式為:Input.GetKeyDown(),推薦傳入枚舉參數為KeyCode.W,這個枚舉參數指的就是鍵盤按鍵w

還可以直接傳入要檢測的按鍵字符,不能傳入大寫字符串,只能傳入小寫字符串。例如直接傳入“q”無論用戶按下的是大寫Q還是小寫q都能正常檢測。

void Update()
{if(Input.GetKeyDown(KeyCode.W)){print("W按下");}if(Input.GetKeyDown("q")){print("Q按下");}
}

(2)鍵盤抬起

檢測鍵盤抬起方式為:Input.GetKeyUp()

void Update()
{if(Input.GetKeyUp(KeyCode.W)){print("W抬起");}
}

(3)鍵盤長按

void Update()
{if(Input.GetKey(KeyCode.S)){print("S長按");}
}

3、檢測默認軸輸入

由于常用的鍵盤輸入就是awsd進行上下左右移動,以及橫縱向移動鼠標調整位置或是視角。因此Unity內置了默認軸輸入相關的便捷方法。

其原理是:將輸?映射到?字坐標系,左/下為負值(-10),右/上為正值(01),中心點為0。

使用的方法是GetAxis,其中GetAxis有漸變,GetAxisRaw沒有漸變(只有0,-1, 1,沒有0~1或是0~-1的過程)

(1)鍵盤AD

使用參數Horizontal,當按A鍵時,就會輸出0~-1之間的數,一直長按會輸出-1;當按D鍵時,就會輸出0~1之間的數,一直長按會輸出1

void Update()
{print(Input.GetAxis("Horizontal"));
}

(2)鍵盤SW

使用參數Vertical,當按S鍵時,就會輸出0~-1之間的數,一直長按會輸出-1;當按W鍵時,就會輸出0~1之間的數,一直長按會輸出1

void Update()
{print(Input.GetAxis("Vertical"));
}

(3)鼠標橫向移動

使用參數Mouse X,當鼠標向左移動時,就會輸出0~-1之間的數;當向右移動時時,就會輸出0~1之間的數

void Update()
{print(Input.GetAxis("Mouse X"));
}

(4)鼠標縱向移動

使用參數Mouse Y,使用參數Mouse X,當鼠標向下移動時,就會輸出0~-1之間的數;當向上移動時時,就會輸出0~1之間的數

void Update()
{print(Input.GetAxis("Mouse Y"));
}

4、任意鍵

可以檢測是否有任意鍵或鼠標長按:Input.anyKey

是否有任意鍵或鼠標按下:Input.anyKeyDown

得到這一幀的鍵盤輸入:InputString

void Update()
{if(Input.anyKey){print("有一個鍵長按");}if(Input.anyKeyDown){print("有一個鍵按下(只打印一次)");print(Input.inputString);}
}

5、手柄輸入相關

        //得到連接的手柄的所有按鍵名字string[] strs = Input.GetJoystickNames();//某一個手柄鍵按下if(Input.GetButtonDown("Jump")){}//某一個手柄鍵抬起if (Input.GetButtonUp("Jump")){}//某一個手柄鍵長按if (Input.GetButton("Jump")){}

6、移動設備觸摸相關

移動設備觸摸一般在UI里完成,這里用的很少

        if(Input.touchCount>0){Touch t1 = Input.touches[0];//位置print(t1.position);//相對上次位置的變化print(t1.deltaPosition);}

是否啟用多點觸控

Input.multiTouchEnabled = false;

7、陀螺儀(重力感應)

例如,滾小球游戲就會用到

是否開啟陀螺儀:

Input.gyro.enabled = true;

一些靜態變量:

//重力加速度向量
print(Input.gyro.gravity);//轉速
print(Input.gyro.rotationRate);//當前旋轉的四元數
print(Input.gyro.attitude);

十二、屏幕相關

1、靜態屬性

(1)常用

獲取當前屏幕分辨率:

通過Screen.currentResolution獲取,獲取的是設備物理分辨率

返回值類型:Resolution結構體,包含width()height(?)refreshRate(刷新率)

void Start()
{Resolution r = Screen.currentResolution;print("當前設備的物理分辨率的寬:"+r.width+"高"+r.height+")");
}

屏幕窗口當前寬高:

獲取的是當前游戲窗口的實際顯示尺寸,會隨窗口大小變化,更適合用于游戲內UI布局和位置計算

void Start()
{print(Screen.width);print(Screen.height);
}

屏幕休眠模式:

通過Screen.sleepTimeout設置,其中SleepTimeout.NeverSleep:? 永不息屏;??????SleepTimeout.SystemSetting:?? 使?系統設置

void Start()
{Screen.sleepTimeout = SleepTimeout.NeverSleep;Screen.sleepTimeout = SleepTimeout.SystemSetting;
}

(2)不常用

下面的都不常用,在開發時一般不在這里用代碼設置,了解即可

運行時是否全屏模式

Screen.fullScreen = true;

窗口模式,共有四種:

//獨占全屏
Screen.fullScreenMode= FullScreenMode.ExclusiveFullScreen;
//全屏窗口
Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
//最大化窗
Screen.fullScreenMode = FullScreenMode.MaximizedWindow;
//窗口模式
Screen.fullScreenMode = FullScreenMode.Windowed;

移動設備屏幕轉向相關

允許自動旋轉為左橫向、右橫向、豎向、倒置豎向

//允許自動旋轉為左橫向 Home鍵在左
Screen.autorotateToLandscapeLeft = true;//允許自動旋轉為右橫向 Home鍵在右
Screen.autorotateToLandscapeRight = true;//允許自動旋轉為上橫向 Home鍵在上
Screen.autorotateToPortraitUpsideDown = true;//允許自動旋轉為下橫向 Home鍵在下
Screen.autorotateToPortrait = true;

2、靜態方法

設置分辨率,一般移動設備不用,三個參數分別為:寬、高、是否全屏

 Screen.SetResolution(1920, 1080, true);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94825.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Dubbo的高并發服務治理與流量控制實戰指南

基于Dubbo的高并發服務治理與流量控制實戰指南 在微服務架構的大規模應用場景中&#xff0c;如何保證服務在高并發壓力下的穩定與可用&#xff0c;是每位后端開發者必須面對的挑戰。本文結合實際生產環境經驗&#xff0c;分享基于Apache Dubbo的高并發服務治理與流量控制方案&a…

Mac 洪泛攻擊筆記總結補充

一、Mac 洪泛攻擊原理交換機依靠 MAC 地址表來實現數據幀的精準轉發&#xff0c;該表記錄著端口與相連主機 MAC 地址的對應關系。交換機具備自動學習機制&#xff0c;當收到一個數據幀時&#xff0c;會將幀中的源 MAC 地址與進入的端口號記錄到 MAC 表中。同時&#xff0c;由于…

路由器不能上網的解決過程

情況 前段時間&#xff0c;公司來人弄了一下網絡后&#xff0c;我的路由器就不能上網了&#xff0c;怎么回事啊。 先看看路由器的情況&#xff1a;看著網絡是有連接的&#xff1a;看這上面是能上網的&#xff0c;但是網都是上不去。 奇怪&#xff01; 路由器介紹 路由器&#x…

Rancher 和 KubeSphere對比

以下是 Rancher 與 KubeSphere 的深度對比&#xff0c;涵蓋核心定位、架構設計、功能模塊、適用場景等關鍵維度&#xff0c;助您精準選型&#xff1a;一、核心定位與設計哲學維度RancherKubeSphere本質Kubernetes 多集群管理控制平面Kubernetes 全棧云原生操作系統目標簡化K8s集…

【深度學習新浪潮】TripoAI是一款什么樣的產品?

TripoAI是由硅谷AI初創公司VAST開發的多模態3D內容生成平臺,其核心技術基于數十億參數的3D基礎模型,專注于通過文本描述、單圖/多圖輸入或手繪涂鴉快速生成高精度可編輯的3D模型。以下是其核心信息: 一、技術架構與核心功能 秒級生成與多模態輸入 生成速度:僅需8秒即可生成…

二十八天(數據結構:圖的補充)

圖&#xff1a;是一種非線性結構形式化的描述: G{V,R}V:圖中各個頂點元素(如果這個圖代表的是地圖&#xff0c;這個頂點就是各個點的地址)R:關系集合&#xff0c;圖中頂點與頂點之間的關系(如果是地圖&#xff0c;這個關系集合可能就代表的是各個地點之間的距離)在頂點與頂點…

戶外廣告牌識別準確率↑32%:陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止任何形式的轉載與抄襲。一、行業痛點&#xff1a;戶外廣告牌識別的三大技術瓶頸戶外廣告牌作為城市視覺符號的重要載體&#xff0c;其智能化識別在商業監測、合規監管等…

【vue組件通信】一文了解組件通信多種方式

前言 在 Vue 中&#xff0c;組件通信有多種方式&#xff0c;適用于不同場景&#xff08;父子組件、兄弟組件、跨級組件等&#xff09;。以下是完整的組件傳值方法總結&#xff0c;僅供概覽參考&#xff1a;一、父子組件通信 1. Props&#xff08;父 → 子&#xff09; 父組件通…

項目一系列-第3章 若依框架入門

第3章 若依框架入門 3.1 若依框架概述 為什么要基于若依框架開發&#xff1f; 快速開發&#xff1a;能快速搭建一個應用框架&#xff0c;減少工作量。可定制化&#xff1a;提供豐富插件和拓展點&#xff0c;滿足不同項目的特定需求。簡化開發流程&#xff1a;框架提供常用的功能…

WSL安裝MuJoco報錯——FatalError: gladLoadGL error

文章目錄WSL中配置MuJoCo報錯 FatalError: gladLoadGL error 的終極解決方案&#x1f50d; 問題原因分析? 解決方案&#xff1a;切換至 EGL 渲染后端第一步&#xff1a;安裝系統級依賴庫第二步&#xff1a;使用 Conda 安裝兼容的圖形庫第三步&#xff1a;設置環境變量以啟用 E…

2025產品經理接單經驗分享與平臺匯總

產品和開發永遠是一家&#xff0c;如此說來產品和開發接單的經驗和平臺其實大差不差&#xff0c;今天剛好看到后臺有人咨詢產品經理接單的問題&#xff0c;索性直接寫一篇文章好了。 目錄 一、產品經理接單的三個關鍵建議 1、能力產品化&#xff0c;比履歷更重要 2、合同、…

BGP協議筆記

一、BGP協議&#xff08;邊界網關協議&#xff09; 是一種用于自治系統間的動態路由協議&#xff0c;是一種外部網關(EGP)協議。負責在不同自治系統(AS)之間交換路由信息&#xff0c;目的是實現大規模網絡的可擴展性、策略控制和穩定性。 自治系統AS&#xff1a;一組被進行統…

Ⅹ—6.計算機二級綜合題27---30套

第27套 【填空題】 給定程序中,函數fun的功能是:計算形參x所指數組中N個數的平均值(規定所有數均為正數),將所指數組中小于平均值的數據依次移至數組的前部,大于等于平均值的數據依次移至x所指數組的后部,平均值作為函數值返回,在主函數中輸出平均值和移動后的數據。 …

GDB 調試全方位指南:從入門到精通

在程序開發中&#xff0c;調試是定位和解決問題的核心環節。GDB (GNU Debugger) 作為一款功能強大的命令行調試器&#xff0c;是Linux環境下C/C開發者的必備利器。本文將系統講解GDB的使用方法&#xff0c;涵蓋基礎操作到高級技巧&#xff0c;助你高效排錯。一、基礎準備&#…

Python:從元類到多態的實戰指南

Python 作為一門靈活且強大的編程語言&#xff0c;其高級特性為開發者提供了極大的創造力和代碼優化空間。本文將圍繞元類、序列化、抽象類與多態等核心高級特性展開&#xff0c;結合豐富的實戰代碼示例&#xff0c;從原理到應用進行全方位解析&#xff0c;幫助你更深入地理解 …

LLM實戰(三)——昇騰300i duo推理卡(NPU)大模型推理記錄

npu推理環境配置:https://ascend.github.io/docs/sources/ascend/quick_install.html llama-factory適配的NPU說明:https://llamafactory.readthedocs.io/zh-cn/latest/advanced/npu_inference.html 一些CANN命令: 與cuda的對應關系 # 查看NPU信息 npu-smi info = nvidia-s…

【原創】銳捷AM5532宿舍AP接口狀態智能巡檢實戰:Python腳本+Excel報表+QQ自動推送,某高校落地案例

? 項目已穩定運行 180+ 天,累計巡檢 14 萬接口,郵件告警 0 漏報 ?? CSDN 質量分 5.0 標準:代碼 + 圖表 + 可落地 + 可復制, 歡迎收藏、點贊、評論三連! 一、背景 某 高校學生宿舍采用銳捷 RG-AM5532 系列交換機下掛無線 AP,高峰期 2.4 萬終端并發。 網絡中心痛點: …

用戶、組和目錄的磁盤配額

一、XFS_quota限制用戶和組的容量&#xff08;block&#xff09;與文件數量&#xff08;inode&#xff09;&#xff1b;限制block就限制了用戶可以使用的磁盤容量&#xff0c;限制inode就可以限制用戶新建的文件數量限制某一目錄的最大磁盤配額&#xff08;directory project&a…

[GESP202506 五級] 最大公因數

題目描述 對于兩個正整數 a,ba,ba,b&#xff0c;他們的最大公因數記為 gcd?(a,b)\gcd(a,b)gcd(a,b)。對于 k>3k > 3k>3 個正整數 c1,c2,…,ckc_1,c_2,\dots,c_kc1?,c2?,…,ck?&#xff0c;他們的最大公因數為&#xff1a; gcd?(c1,c2,…,ck)gcd?(gcd?(c1,c2,……