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