二:Unity 3D 脚本介绍
一:Unity 3D 主要支持
(1)JavaScript
(2)C#
C# 在編程理念上更符合 Unity 3D 的引擎原理
Visual Studio Code中運行C#:https://blog.csdn.net/qq_24892029/article/details/108885286
?
二:c#腳本基礎(chǔ)
Unity 3D 中,C# 腳本需要預(yù)先載入類庫,
1:常用函數(shù)
(1)Update()
?? ?正常更新,創(chuàng)建JavaScript腳本默認(rèn)添加這個方法,每一幀都會由系統(tǒng)調(diào)用一次該方法。
?? ?
(2)LateUpdate()
?? ?推遲更新,此方法在 Update() 方法執(zhí)行完后調(diào)用,每一幀都調(diào)用一次。
?? ?
(3)FixedUpdate()
? ?置于這個函數(shù)中的代碼每隔一定時間執(zhí)行一次。
? ?
(4)Awake()
?? ?腳本喚醒,用于腳本的初始化,在腳本生命周期中執(zhí)行一次。
?? ?
(5)Start()
? ?? ?在 Update() 之前、Awake() 之后執(zhí)行。Start() 函數(shù)和 Awake() 函數(shù)的不同點在于 Start() 函數(shù)僅在腳本啟用時執(zhí)行。
?? ?
(6)OnDestroy()
?? ?當(dāng)前腳本銷毀時調(diào)用。
?? ?
(7)OnGUI()
?? ?繪制游戲界面的函數(shù),因為每一幀要執(zhí)行多次,所以相關(guān)的函數(shù)要盡量避免直接在該函數(shù)內(nèi)部使用。
?? ?
(8)OnCollisionEnter()
? ? 當(dāng)一個游戲?qū)ο笈c另外的游戲?qū)ο笈鲎矔r執(zhí)行這個函數(shù)
?? ?
(9)OnMouseDown()
? ?當(dāng)鼠標(biāo)在一個載有 GUI 元素(GUI Element)或碰撞器(Collider)的游戲?qū)ο笊习聪聲r執(zhí)行該函數(shù)。
? ?
(10)OnMouserOver()
?? ?當(dāng)鼠標(biāo)在一個載有 GUI 元素或碰撞器的游戲?qū)ο笊辖?jīng)過時執(zhí)行該函數(shù)。?? ?
?? ?
(11)OnMouseExit()
?? ?鼠標(biāo)離開物體范圍時執(zhí)行該函數(shù)
?? ?
(12)OnMouseEnter()
?? ?鼠標(biāo)進入物體范圍時執(zhí)行該函數(shù)。和 OnMouseOver() 不同,OnMouseEnter() 函數(shù)只執(zhí)行一次。
(13)OnMouseUp()
?? ?當(dāng)鼠標(biāo)釋放時執(zhí)行該函數(shù)
?? ?
(14)OnMouseDrag()
? ? 按住鼠標(biāo)拖動對象時執(zhí)行該函數(shù)
?
2:編寫腳本
s1執(zhí)行 Assets → Create → C#Script 或 JavaScript 菜單命令創(chuàng)建一個空白腳本,將其命名為 Move。
s2執(zhí)行 Edit → Project Settings → Input(輸入)菜單命令,對映射到水平和垂直方向的名稱和快捷鍵進行修改。
?
3:鏈接腳本
腳本創(chuàng)建完成后,需要將其添加到物體上。在 Hierarchy 視圖中,單擊需要添加腳本的游戲物體 如Main Camera(主攝像機),
然后執(zhí)行 Component → Script → Move 菜單命令,Move 腳本就鏈接到了 Main Camera 上。
?
三:實踐案例一
? ? ? 游戲場景中出現(xiàn)的所有物體都屬于游戲?qū)ο?#xff0c;游戲?qū)ο笾g的交互可通過腳本的控制來實現(xiàn)。
創(chuàng)建游戲?qū)ο蟮姆椒?#xff1a;
(1)將物體模型資源由 Project 視圖直接拖拽到 Hierarchy 面板中。
(2)使用菜單命令創(chuàng)建 Unity 3D 自帶的游戲?qū)ο蟆?br /> (3)利用腳本編程,動態(tài)的創(chuàng)建或刪除游戲?qū)ο蟆?br /> ?? ?a:使用 CreatePrimitive 方法創(chuàng)建 Unity 3D 系統(tǒng)自帶的基本游戲?qū)ο蟆?br /> ?? ?b:使用 Instantiate 實例化方法將預(yù)制體實例化為對象。
1:案例設(shè)計
? ? 本案例通過C#腳本在Unity 3D中創(chuàng)建一個Cube 模型和一個Sphere 模型,通過屏幕左上角按鈕進行創(chuàng)建操作。
?
2:案例實施
? ?使用 CreatePrimitive 方法創(chuàng)建 Unity 3D 系統(tǒng)自帶的基本游戲?qū)ο?#xff0c;創(chuàng)建空白腳本寫入代碼。
using UnityEngine;
using System.Collections;
public class CreatePrimitive:MonoBehaviour{
? ? void OnGUI(){
? ? ? ? if(GUILayout.Button("CreateCube", GUILayout.Height(50))){
? ? ? ? ? ? GameObject m_cube=GameObject.CreatePrimitive(PrimitiveType.Cube);
? ? ? ? ? ? m_cube.AddComponent<Rigidbody>();
? ? ? ? ? ? m_cube.GetComponent<Renderer>().material.color=Color.blue;
? ? ? ? ? ? m_cube.transform.position=new Vector3(0, 10, 0);
? ? ? ? }
? ? ? ? if(GUILayout.Button("CreateSphere", GUILayout.Height(50))){
? ? ? ? ? ? GameObject m_cube=GameObject.CreatePrimitive(PrimitiveType.Sphere);
? ? ? ? ? ? m_cube.AddComponent<Rigidbody>();
? ? ? ? ? ? m_cube.GetComponent<Renderer>().material.color=Color.red;
? ? ? ? ? ? m_cube.transform.position=new Vector3(0, 10, 0);
? ? ? ? }
? ? }
}
? ? ? 在上述 OnGUI() 函數(shù)中,單擊 CreateCube 按鈕或 CreateSphere 按鈕后,將分別調(diào)用 CreatePrimitive 方法,從而創(chuàng)建 Cube 和 Sphere 游戲?qū)ο?#xff0c;并且為這兩個游戲?qū)ο筇砑觿傮w、顏色以及位置屬性。
?
四:實踐案例二
? ? ? ?在腳本編寫中我們會經(jīng)常用到移動、旋轉(zhuǎn)、縮放功能,可以使用transform.Translate()、transform.Rotate() 和 transform.localScale 來實現(xiàn)這一效果。
1:案例設(shè)計:
? ? ?本案例計劃通過 C# 腳本在 Unity 內(nèi)創(chuàng)建一個簡單的 Cube 模型,采用 OnGUI 函數(shù)寫 3 個交互按鈕,實現(xiàn)與 Cube 模型進行移動、旋轉(zhuǎn)、縮放的交互功能。
2:案例實施:
(1)為游戲項目里的游戲場景添加兩個游戲?qū)ο?#xff1a;Cube和Directional,
?? ?Cube是腳本具體操作的游戲?qū)ο蟆?br /> ?? ?
?? ?Directional是產(chǎn)生場景照明效果的游戲?qū)ο蟆?br /> ?? ?
創(chuàng)建一個 Plane 位于 Cube 下方。調(diào)整游戲場景中 3 個游戲?qū)ο蟮奈恢?#xff0c;使得 Game 視圖達到最佳的效果。
(2)在 Project 視圖里,新建一個 C# 腳本,命名為 MyScript,打開此腳本并添加下面的代碼
using UnityEngine;
using System.Collections;
public class MyScript:MonoBehaviour
{
? ? //聲明4個變量
? ? public GameObject myCube;
? ? public int transSpeed=100;
? ? public float rotaSpeed=10.5f;
? ? public float scale=3;
?? ?
? ? void OnGUI(){
? ? ? ? if(GUILayout.Button("移動立方體")){
? ? ? ? ? ? myCube.transform.Translate(Vector3.forward*transSpeed*Time.deltaTime, Space.World);
? ? ? ? }
? ? ? ? if(GUILayout.Button("旋轉(zhuǎn)立方體")){
? ? ? ? ? ? myCube.transform.Rotate(Vector3.up*rotaSpeed, Space.World);
? ? ? ? }
? ? ? ? if(GUILayout.Button("縮放立方體")){
? ? ? ? ? ? myCube.transform.localScale=new Vector3(scale, scale, scale);
? ? ? ? }
? ? }
}
該腳本聲明了 4 個變量,并都使用 public進行修飾,所以它們都可以作為屬性出現(xiàn)在組件下。OnGUI() 函數(shù)用于在界面中顯示按鈕,玩家可以通過單擊按鈕實現(xiàn)與立方體的交互功能。
(3)將腳本 MyScript 賦予 Main Camera;在檢查器中分配MyScript腳本的myCube變量給予對象。
(4)運行游戲,在 Game 視圖的左上角會出現(xiàn) 3 個按鈕:“移動立方體”、“旋轉(zhuǎn)立方體”和“縮放立方體”。單擊按鈕,即可完成對立方體對象的指定操作。
?
五:實踐案例三
? ?Unity 3D 中提供了第一人稱和第三人稱虛擬漫游組件,虛擬漫游可以提升游戲玩家對游戲產(chǎn)生的沉浸感。本案例通過腳本實現(xiàn)第一人稱虛擬漫游功能的實踐操作,熟悉并掌握編寫 Unity 3D 腳本實現(xiàn)游戲功能的方法。
1:案例設(shè)計
? ? 本案例采用 C# 腳本開發(fā)第一人稱虛擬漫游功能。
? ? 構(gòu)建簡單的 3D 場景,使用 W、S、A、D鍵即可在場景內(nèi)自由行走,還可以通過鼠標(biāo)實現(xiàn)觀察者視角的旋轉(zhuǎn)功能。
?
2:案例實施
(1)執(zhí)行 GameObject → 3D Object → Plane 命令創(chuàng)建一個平面。
(2)執(zhí)行 GameObject → Create Empty 命令創(chuàng)建空物體,并將標(biāo)簽設(shè)為 Player。
? ? ? ?一個標(biāo)簽是用來索引一個或一組游戲?qū)ο蟮脑~。標(biāo)簽是為了編程的目的而對游戲?qū)ο蟮臉?biāo)注,游戲開發(fā)人員可以使用標(biāo)簽來書寫腳本代碼,通過搜索找到包含想要的標(biāo)簽的對象。
?? ?添加標(biāo)簽方法很簡單,選中 Inspector 面板右上方的 Tag,點擊 Add Tag 將在檢視面板打開標(biāo)簽管理器,然后在里面輸入 Player。
?? ?然后再次選擇空物體,在 Tag 的下拉列表中找到 Player 標(biāo)簽,完成添加標(biāo)簽。
(3)為主角添加角色控制器組件。執(zhí)行 Component → Physics → Character Controller
? ? 角色控制器主要用于第三人稱或第一人稱游戲主角控制,并不使用剛體物理效果
(4)添加 Rigidbody 組件,取消選中 Use Gravity 復(fù)選框,選中 Is Kinematic 復(fù)選框使其不受物理影響,而是受腳本控制。
(5)調(diào)整 Character Controller 的位置和大小,使其置于平面之上。
(6)創(chuàng)建 C# 腳本,將其命名為 Player。
using UnityEngine;
using System.Collections;
public class Player:MonoBehaviour{
? ? public Transform m_transform;
? ? //角色控制器組件
? ? CharacterController m_ch;
? ? //角色移動速度
? ? float m_movSpeed=3.0f;
? ? //重力
? ? float m_gravity=2.0f;
? ? //攝像機Transform
? ? Transform m_camTransform;
? ? //攝像機旋轉(zhuǎn)角度
? ? Vector3 m_camRot;
? ? //攝像機高度
? ? float m_camHeight=1.4f;
? ? void Start(){
? ? ? ? m_transform=this.transform;
? ? ? ? //獲取角色控制器組件
? ? ? ? m_ch=this.GetComponent<CharacterController>();
? ? ? ? ? ? //獲取攝像機
? ? ? ? m_camTransform=Camera.main.transform;
? ? ? ? Vector3 pos=m_transform.position;
? ? ? ? pos.y+=m_camHeight;
? ? ? ? m_camTransform.position=pos;
? ? ? ? //設(shè)置攝像機的旋轉(zhuǎn)方向與主角一致
? ? ? ? m_camTransform.rotation=m_transform.rotation;
? ? ? ? m_camRot=m_camTransform.eulerAngles;
? ? ? ? //鎖定鼠標(biāo)
? ? ? ? Screen.lockCursor=true;
? ? ? ??
? ? }
? ? void Update(){
? ? ? ? Control();
? ? }
? ? void Control(){
? ? ? ? //獲取鼠標(biāo)移動距離
? ? ? ? float rh=Input.GetAxis("Mouse X");
? ? ? ? float rv=Input.GetAxis("Mouse Y");
? ? ? ? //旋轉(zhuǎn)攝像機
? ? ? ? m_camRot.x-=rv;
? ? ? ? m_camRot.y+=rh;
? ? ? ? m_camTransform.eulerAngles=m_camRot;
? ? ? ? //使角色的面向方向與攝像機一致
? ? ? ? Vector3 camrot=m_camTransform.eulerAngles;
? ? ? ? camrot.x=0;camrot.z=0;
? ? ? ? m_transform.eulerAngles=camrot;
? ? ? ? //操作角色移動代碼
? ? ? ? //使攝像機位置與角色一致
? ? ? ? Vector3 pos=m_transform.position;
? ? ? ? pos.y+=m_camHeight;
? ? ? ? m_camTransform.position=pos;
? ? ? ? //定義3個值控制移動
? ? ? ? float xm=0, ym=0, zm=0;
? ? ? ? //重力運動
? ? ? ? ym-=m_gravity*Time.deltaTime;
? ? ? ? //前后左右移動
? ? ? ? if(Input.GetKey(KeyCode.W)){
? ? ? ? ? ? zm+=m_movSpeed*Time.deltaTime;
? ? ? ? }else if(Input.GetKey(KeyCode.S)){
? ? ? ? ? ? zm-=m_movSpeed*Time.deltaTime;
? ? ? ? }
? ? ? ? if(Input.GetKey(KeyCode.A)){
? ? ? ? ? ? xm-=m_movSpeed*Time.deltaTime;
? ? ? ? }else if(Input.GetKey(KeyCode.D)){
? ? ? ? ? ? xm+=m_movSpeed*Time.deltaTime;
? ? ? ? }
? ? ? ? //使用角色控制器提供的Move函數(shù)進行移動
? ? ? ? m_ch.Move(m_transform.TransformDirection(new Vector3(xm, ym, zm)));
? ? }
}
? ?上述代碼通過控制鼠標(biāo)旋轉(zhuǎn)攝像機方向,使角色跟隨攝像機的 Y 軸旋轉(zhuǎn)方向,在移動角色時,使攝像機跟隨角色運動。
? ? 在 Start 函數(shù)中,首先獲取 CharacterController 組件,然后在 Control 函數(shù)中通過鍵盤操作獲得 X 和 Y 方向上的移動距離,最后使用 CharacterController 組件提供的 Move 函數(shù)移動角色。
使用 CharacterController 提供的功能進行移動時,會自動計算移動體與場景之間的碰撞。
(7)在 Hierarchy 視圖中選中 Player 游戲?qū)ο?#xff0c;在其 Inspector 屬性面板中選擇 Component→Script,選擇 Player 腳本將其鏈接到 Player 游戲?qū)ο笊稀?/strong>
?
(8)單擊 Play 按鈕進行測試,效果如下圖所示,通過鼠標(biāo)操作可以在場景中旋轉(zhuǎn)視角,通過 W、S、A、D 鍵可以在場景中向前、向后、向左、向右移動。
?
?
總結(jié)
以上是生活随笔為你收集整理的二:Unity 3D 脚本介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 总结:IDEA如何解析wsdl文件为Ja
- 下一篇: 前端学习(1963)vue之电商管理系统