Unity 3D腳本
1 創(chuàng)建腳本
1.1 C#腳本
Project視圖
右鍵 > Create
> C# Script
using UnityEngine;
public class CSharp : MonoBehaviour{
void Start(){
}
void Update(){
}
}
1.2 JavaScript腳本
Project視圖
右鍵 > Create
> Javascript
function Start(){
}
function Update(){
}
以后腳本都以C#為例
1.3 設(shè)置腳本自定義圖標(biāo)
選中腳本 -> 點(diǎn)擊
2 MonoBehaviour
所有繼承MonoBehaviour
的類從腳本喚醒到銷毀有著完整的生命周期
Awake()
喚醒方法
當(dāng)游戲?qū)ο蟊粍?chuàng)建時(shí)調(diào)用,無(wú)論腳本
是否激活
都會(huì)調(diào)用。
Start()
開(kāi)始方法
在
腳本第一次激活
的時(shí)候立即執(zhí)行(位于Awake()
之后執(zhí)行),只會(huì)執(zhí)行一次(即使重新激活腳本
,也不會(huì)執(zhí)行了)。
Update()
更新方法
只要腳本處于激活狀態(tài)之下,每一幀都會(huì)調(diào)用
Update()
LateUpdate()
延遲更新方法
處于激活狀態(tài)下,在
Update()
調(diào)用后會(huì)調(diào)用LateUpdate()
FixedUpdate()
固定更新函數(shù)
在游戲運(yùn)行過(guò)程中,每一幀處理的時(shí)間是不固定的。當(dāng)需要固定間隔執(zhí)行一些代碼時(shí)就會(huì)用到
FixedUpdate()
函數(shù)。也是在激活狀態(tài)下。
固定調(diào)用時(shí)間可以在:Edite
->Project Settings
->Time
下的Fixed Timestep
設(shè)置
OnDestory()
銷毀事件
當(dāng)前腳本
銷毀
時(shí)調(diào)用。
OnDisable()
禁用事件
在腳本被
禁用
時(shí)調(diào)用(每次禁用都會(huì)調(diào)用)
OnEnable()
激活事件
腳本在
激活
時(shí)調(diào)用(每次激活都會(huì)調(diào)用)
OnGUI()
繪制GUI時(shí)調(diào)用。現(xiàn)在一般不適用此GUI。Untiy有了
UGUI
3 調(diào)試
Debug.Log() |
輸出普通信息(白色) |
Debug.LogWarning() |
輸出警告信息(黃色) |
Debug.LogError() |
輸出錯(cuò)誤信息(紅色) |
void Start(){
Debug.Log("log...");
Debug.LogWarning("warning....");
Debug.LogError("error....");
}
4 游戲?qū)ο蟮牟僮?/h2>
4.1 創(chuàng)建游戲物體
void Start(){
// 創(chuàng)建膠囊體
GameObject.CreatePrimitive(PrimitiveType.Capsule);
}
void Start(){
// 創(chuàng)建膠囊體
GameObject.CreatePrimitive(PrimitiveType.Capsule);
}
PrimitiveType
類型:
類型 | 說(shuō)明 |
---|---|
Capsule | 膠囊體 |
Sphere | 球體 |
Cylinder | 圓柱體 |
Cube | 正方體 |
Plane | 平面 |
Quad | 片 |
4.2 獲取游戲?qū)ο?/h3>
通過(guò)指定
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
}
}
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
}
}
從Hierarchy
視圖中拖一個(gè)游戲物體到My Cube
后面;或者點(diǎn)小圓圈選擇一個(gè)。
同過(guò)代碼獲取游戲?qū)ο?/h4>
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
// 通過(guò)游戲名稱查找游戲?qū)ο? myCube = GameObject.Find("Cube");
// 通過(guò)標(biāo)簽查找游戲?qū)ο? myCube = GameObject.FindWithTag("Player");
// 也是通過(guò)游戲標(biāo)簽獲取一個(gè)游戲?qū)ο? myCube = GameObject.FindGameObjectWithTag("Palyer");
// 通過(guò)標(biāo)簽獲取多個(gè)游戲?qū)ο? var list = GameObject.FindGameObjectsWithTag("cubes");
// 通過(guò)類型或游戲?qū)ο? var obj = GameObject.FindObjectOfType(typeof(Rigidbody));
// 通過(guò)類型獲取對(duì)象
var lists = GameObject.FindObjectsOfType(typeof(Rigidbody));
}
}
5 添加組件和修改組件
void Start(){
// 向當(dāng)前游戲?qū)ο筇砑右粋€(gè) 剛體組件
gameObject.AddComponent<Rigidbody>();
// 獲取當(dāng)前游戲?qū)ο笊系?剛體 組件
var rigidbody = GetComponent<Rigidbody>();
// 修改組件值
rigidbody.mass = 100;
}
using System;
using UnityEngine;
public class Test : MonoBehaviour{
public GameObject myCube;
void Start(){
// 通過(guò)游戲名稱查找游戲?qū)ο? myCube = GameObject.Find("Cube");
// 通過(guò)標(biāo)簽查找游戲?qū)ο? myCube = GameObject.FindWithTag("Player");
// 也是通過(guò)游戲標(biāo)簽獲取一個(gè)游戲?qū)ο? myCube = GameObject.FindGameObjectWithTag("Palyer");
// 通過(guò)標(biāo)簽獲取多個(gè)游戲?qū)ο? var list = GameObject.FindGameObjectsWithTag("cubes");
// 通過(guò)類型或游戲?qū)ο? var obj = GameObject.FindObjectOfType(typeof(Rigidbody));
// 通過(guò)類型獲取對(duì)象
var lists = GameObject.FindObjectsOfType(typeof(Rigidbody));
}
}
void Start(){
// 向當(dāng)前游戲?qū)ο筇砑右粋€(gè) 剛體組件
gameObject.AddComponent<Rigidbody>();
// 獲取當(dāng)前游戲?qū)ο笊系?剛體 組件
var rigidbody = GetComponent<Rigidbody>();
// 修改組件值
rigidbody.mass = 100;
}
其他組件操作都一樣
6 發(fā)送消息
游戲?qū)ο箝g通訊
使用GameObject.SendMessage()
方法
// 方法名:要在游戲?qū)ο笾姓{(diào)用的方法;
GameObject.SendMessage(string methodName);
// 方法名 和 要傳遞的`參數(shù)`
GameObject.SendMessage(string methodName, object value);
// 方法名 和 配置項(xiàng)->
GameObject.SendMessage(string methodName, SendMessageOptions option);
SendMessageOptions | |
---|---|
DontRequireReceiver | 不需要回應(yīng) |
RequireReceiver | 必須回應(yīng) |
GameObject.SendMessage(string methodName,object value ,SendMessageOptions option);
游戲?qū)ο驛代碼:
void Start(){
// 獲取發(fā)送消息的游戲?qū)ο? var myCube = GameObject.Find("TestCube");
if(myCube != null){
// 向獲取到的游戲?qū)ο蟀l(fā)送消息
myCube.SendMessage("methodName");
}
}
TestCube游戲?qū)ο笾写a:
// 額外添加 methodName 讓A對(duì)象里的 SendMessage 調(diào)用。
public void methodName(){
print("call....");
}
SendMessageUpWards
向物體和父物體發(fā)送消息
BroadcastMessage
對(duì)物體和所有子物體發(fā)送消息(廣播消息)
7 克隆游戲物體 Instantiate
方法
// 手動(dòng)在unity編輯中賦值
public GameObject cube;
void Start(){
// 克隆cube 第一個(gè)參數(shù)就是 cube變量 第二個(gè)參數(shù):克隆的游戲物體在世界中的這邊 第三個(gè)參數(shù):不旋轉(zhuǎn)
var go = Instantiate(cube,Vector3.zero,Quaternion.identity);
}
8 移動(dòng)、旋轉(zhuǎn)和縮放游戲?qū)ο?Transform
組件)
每個(gè)游戲物體都會(huì)有一個(gè)Transform
組件,這個(gè)組件是無(wú)法移除的。
Transform
面板一共包含3個(gè)屬性:Position
(位置) Rotation
(旋轉(zhuǎn)) Scale
(縮放)
我們可以用
Scene
視圖工具
來(lái)拖動(dòng)和旋轉(zhuǎn)游戲?qū)ο?,也可以直接改?code>Transform組件里的值。
8.1 游戲?qū)ο蟮奈恢?/h3>
在3D世界中,任何一個(gè)模型的三維坐標(biāo)都保存在Vector3
結(jié)構(gòu)中,該結(jié)構(gòu)保存了 x坐標(biāo),y坐標(biāo),z這邊。改變Vector3
結(jié)構(gòu)里面的值,對(duì)應(yīng)場(chǎng)景里面模型也會(huì)改變位置。
8.2 移動(dòng)游戲?qū)ο?/h3>
using UnityEngine;
public class Test : MonoBehaviour{
void Update(){
// 直接改變
transform.position = new Vector3(0, 100, 0);
// 相當(dāng)于在游戲?qū)ο蟮漠?dāng)前位置 加上 給定的 Vector3
transform.Translate(new Vector3(0, 0, 10));
}
}
8.3 縮放游戲?qū)ο?/h3>
// x為x軸向的縮放,y為y軸向的縮放,z為軸向的縮放
transform.localScale = new Vector3(x, y, z);
// 整體縮放 1.5 倍;
transform.localScale *= 1.5f;
8.4 旋轉(zhuǎn)游戲?qū)ο?/h3>
using UnityEngine;
public class Test : MonoBehaviour{
void Update(){
// 直接改變
transform.position = new Vector3(0, 100, 0);
// 相當(dāng)于在游戲?qū)ο蟮漠?dāng)前位置 加上 給定的 Vector3
transform.Translate(new Vector3(0, 0, 10));
}
}
// x為x軸向的縮放,y為y軸向的縮放,z為軸向的縮放
transform.localScale = new Vector3(x, y, z);
// 整體縮放 1.5 倍;
transform.localScale *= 1.5f;
8.4 旋轉(zhuǎn)游戲?qū)ο?/h3>
旋轉(zhuǎn)有兩種:
自轉(zhuǎn)
-
圍繞旋轉(zhuǎn)
圍繞一個(gè)點(diǎn)旋轉(zhuǎn)
// 設(shè)置對(duì)象自轉(zhuǎn),按照z軸自轉(zhuǎn)
transform.Rotate(Vector3.forward);
// 圍繞一個(gè)點(diǎn)旋轉(zhuǎn) 圍繞的位置 按照z軸旋轉(zhuǎn) 旋轉(zhuǎn)角度
transform.RotateAround(myCube.transform.position, Vector3.forward, 2);
8.4 工具類
Time類
Time.time
當(dāng)前游戲時(shí)間
Time.timeScale
游戲時(shí)間的縮放,當(dāng)設(shè)置為0.5f
時(shí),現(xiàn)實(shí)過(guò)去1秒,游戲過(guò)去0.5秒。
Time.deltaTime
上一幀所消耗是時(shí)間
Time.fixedTime
每一次執(zhí)行FiexdUpdate的時(shí)間間隔
Time.fixdDeltaTime
固定更新上一幀消耗的時(shí)間
Time.realtimeSinceStartup
從游戲開(kāi)始一直到現(xiàn)在的真實(shí)時(shí)間,不受Time.Scale影響。
Random類
Random.Range(int min,int max)
生成 min 到 max范圍的隨機(jī)數(shù),返回int
Random.Range(float min,float max)
生成 min 到 max范圍的隨機(jī)數(shù),返回float
8.5 輸入控制Input
鍵盤(pán):
Input.GetKeyDown(KeyCode.W)
按下 W
Input.GetKeyUp(KeyCode.S)
放開(kāi) S
Input.GetKey(KeyCode.A)
按住 A
鼠標(biāo):
Input.GetMouseButton(0)
鼠標(biāo) 左鍵 按住
Input.GetMouseButtonDown(1)
鼠標(biāo) 右鍵 按下
Input.GetMouseButtonUp(2)
鼠標(biāo) 中鍵 抬起
自定義輸入
主菜單 -> Edit
-> Project Settings
-> Input
-> Axes
Size 可以改變Axes
下的數(shù)量
Horizontal
菜單 (其它菜單參數(shù)都一樣)
Name | 名稱 |
Descripttive Name | 描述 |
Descripttive Negative Name | 描述負(fù)數(shù) |
Negative Button | 負(fù)按鈕 |
Positive Button | 正按鈕 |
Alt Negative Button | 次要 負(fù)按鈕 |
Alt Positive Button | 次要 正按鈕 |
Gravity | 重力 按鈕力度 |
Dead | 小于這個(gè)數(shù)的正值或負(fù)值 都將設(shè)置為0 |
Sensitivity | 靈敏度 |
Snap | 在接受到相反的輸入,將立即重置為0 |
Invert | 反向,正的變負(fù)的 |
Type | 輸入類型:Key or Mouse Button 按鍵Mouse Movement 鼠標(biāo)移動(dòng) Joystick Axis 操縱桿 |
Axis | 來(lái)自設(shè)備的輸入軸 |
Joy Num | 使用哪個(gè)操縱桿 |
通過(guò)代碼來(lái)獲取(Axis
)輸入
// 獲取`Axes`下 名稱為 Horizontal 的輸入
float horizontal = Input.GetAxis("Horizontal");
因?yàn)镠orizontal設(shè)置主要按鈕為:<-(方向鍵左) ->(方向鍵右) 次要按鈕:a d
按下(A) horizontal就會(huì)時(shí)負(fù)值 (D) horizontal就是正值
移動(dòng)設(shè)備輸入Touch
觸碰
fingerId
手指id
phase
手指的階段
position
按下的坐標(biāo)
Began | 開(kāi)始接觸屏幕 |
Moved | 移動(dòng) |
Stationary | 靜止 |
Ended | 離開(kāi)屏幕 |
Canceled | 系統(tǒng)關(guān)閉觸摸屏 |
重力感應(yīng)Acceleration
Vector3 posistion = Input.acceleration
posistion.x
正向?yàn)樵O(shè)備向右
posistion.z
正向?yàn)樵O(shè)備使用者方式
posistion.y
正向?yàn)樵O(shè)備向上
其它相關(guān)API
Input.deviceOrientation
當(dāng)前游戲運(yùn)行朝向
Input.touchSupported
是否支持手指觸碰操作
Input.multiTouchEnable
是否支持多點(diǎn)觸碰