- 音頻
audio.PlayOneShot (getSound);
//播放一個音頻剪輯,必須添加音頻源組件
AudioSource.PlayClipAtPoint (getSound,transform.position);
//在指定位置播放剪輯。播放完成後自動消除音頻源。這種方法不需要添加音頻源組件
- 修改光源的顏色
public Light doorLight;
//doorLight.color = Color.red;
- 對象查找
using UnityEngine;
//通過物體名查找某個GameObject
GameObject.Find("powerTxt").GetComponent<GUIText>();
GameObject.Find("powerTxt").GetComponent("GUIText") as GUIText;
//查找一般放在start函數中,賦值給某個變量,Find是在所有遊戲物體中查找,需要遍歷,浪費性能,最好不要在update中使用此方法
- 光線投射的碰撞檢測
三個參數:射線的起點,方向,碰撞信息,長度
如果返回true,hit將包含碰撞的更多信息
RaycastHit hit;
if (Physics.Raycast (transform.position, transform.forward, out hit, 3))
{
if (hit.collider.transform.tag == "playerDoor")
{
hit.collider.SendMessage ("openMyDoor");
}
}
- SendMessage
cube.SendMessage ("addSum1",10);
//執行遊戲物體腳本中的指定函數
- 以秒計算,完成每一幀的時間
Time.deltaTime
- 播放某個動畫
animation.Play ("doorshut");
- 角色控制的碰撞檢測。在移動的時候,當controller碰撞到collider時OnControllerColliderHit被調用。
void OnControllerColliderHit(ControllerColliderHit hit)
- 銷燬遊戲物體,時間參數
Destroy(gameObject,1);
- 遊戲物體旋轉
transform.Rotate(0,Time.deltaTime * 100,0);
////改變物體的旋轉方向
instance.transform.rotation = Quaternion.Euler(0, 180, 0);
- 觸發碰撞,需要將is Trigger選中
void OnTriggerEnter(Collider coll)
- xy方向的移動
moveDir = new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));
///xy方向的移動
///同上
float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.Translate(x,0,z);
- 檢查鍵盤上某個鍵是否按下
Input.GetKey(KeyCode.W);
///按下返回true
- 複製一個預設,添加力,讓其物理運動
Transform n = Instantiate(zidan,transform.position,transform.rotation) as Transform;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
///n.rigidbody.AddForce(fwd * 1000); 過時了
n.GetComponent<Rigidbody>().AddForce(fwd * 1000);
15.GetComponent<Main>().enabled = false;
GameObject.Find ("Plane").GetComponent<Restart>().enabled = true;
///將腳本Main禁用
///啓用Plane物體上的Restart腳本
- 畫UI部分都在OnGUI來處理
void OnGUI(){
if (GUI.Button(new Rect(500, 250, 80, 40), "退出"))//創建文本按鈕
{
Application.Quit();//退出應用
}
if (GUI.Button(new Rect(300, 250, 80, 40), "開始"))
{
Application.LoadLevel("01");//加載關卡
}
}
- 加載一個紋理
///transform.renderer.material.mainTexture = Resources.Load("0") as Texture;過時了
transform.GetComponent<Renderer>().material.mainTexture = Resources.Load("0") as Texture;
//或者
render = (Renderer)instance.GetComponent("Renderer");
render.material.mainTexture = (Texture)Resources.Load("0");
- 加載文件夾裏的序列圖,存放到一個數組中。
注意:juse爲文件夾名,必須放到Resources文件夾下
private Object[] anim;
anim = Resources.LoadAll ("juese");
- 修改文字字體
//要修改文字字體,可以創建一個GUISKIN,在這個GUISKIN中修改字體,然後GUI.skin = mySkin;
GUI.color = Color.red//文本顏色
- 讓序列圖動起來
//--------------------動畫開始---------------------------------
GUILayout.Label ("當前播放第" + nowFram + "幀");
GUI.DrawTexture(new Rect(10,150,80,100),(anim[nowFram] as Texture),ScaleMode.StretchToFill,true,0);
time += Time.deltaTime;
if (time >= 1.0 / fps)
{
nowFram++;
time = 0;
if(nowFram >= totalFram)
{
nowFram = 0;
}
}
//--------------------動畫結束---------------------------------
- 文本
userName = GUI.TextField (new Rect(400,70,200,30),userName,10);
///輸入文本
pwd = GUI.PasswordField(new Rect(400,100,200,30),pwd,"*"[0],20);
///密碼文本
- C#和js互相調用
首先刪掉#pragma strict嚴謹編譯模式
js文件放在Plugins中
首先編譯Plugins中的代碼
然後Editor
最後其它代碼
///js代碼
function OnGUI()
{
if(GUI.Button(Rect(100,200,100,50),"js調用c#"))
{
var cs = GetComponent("TestCS");
cs.CallMe("js調用c#");
}
}
public function CallMe(tmp:String)
{
Debug.Log(tmp);
}
///c#代碼
void OnGUI(){
if(GUI.Button(new Rect(100,100,100,50),"C#調用js"))
{
TestJS js = (TestJS)GetComponent("TestJS");
js.CallMe("C#調用js");
}
}
public void CallMe(string temp){
Debug.Log(temp);
}
- 通知遊戲主線程等待
///WaitForSeconds()用於通知遊戲主線程等待。一定要將該方法返回類型修改IEnumerator
Debug.Log ("開始等待:" + Time.time);
yield return new WaitForSeconds (3);
Debug.Log ("結束等待:" + Time.time);
- 隨機數
可以隨機整數和浮點數
int a = Random.Range (0,100);
float b = Random.Range (10.0f,100.0f);
- FixedUpdate
Update會在每次渲染新的一幀時,被調用。
而FixedUpdate會在每個固定的時間間隔被調用,FixedUpdate則不受幀率的變化,它是以固定的時間間隔來被調用,那麼這個時間間隔怎麼設置呢?
Edit->Project Setting->time下面的Fixed timestep。所以處理Rigidbody的時候最好用FixedUpdate。
- 在unity中添加新的菜單
using UnityEditor;
[MenuItem ("新的菜單/fuck")]
static void DoSomething () {
Debug.Log ("Perform operation");
}
- 抗鋸齒
在3D渲染過程中,可能會出現鋸齒。爲什麼會出現鋸齒呢?因爲它爲了運行效率而犧牲了渲染效果,鋸齒越多說明渲染效率越快。
Edit-ProjectSettings—Quality Anti Aliasing設置抗鋸齒
- 攝像機
Camera.active = true;false
- 剛體 Rigibody
Mass 質量,數值越大物體下落的越快。
Drag 阻力,
Use Gravity是否使用重力
Is Kinematic是否受物理的影響
- 碰撞與休眠
剛體與物體之間是存在碰撞的。剛體的碰撞分爲三種:進入碰撞、碰撞中、碰撞結束。
休眠可以理解爲讓模型變爲靜止狀態。
OnCollisionEnter();///開始接觸時,立刻調用此方法
OnCollisionStay();///碰撞的過程中,每幀都會調用,知道碰撞結束
OnCollistionExit();///停止接觸
- 碰撞器
遊戲對象需要感應碰撞,必須給其添加碰撞器:
Box Collider 盒子碰撞器
Sphere Collider 球體碰撞器
Capsule Collider 膠囊碰撞器
Mesh Collider 網格碰撞器
Wheel Collider 車輪碰撞器
- 碰撞
剛體Rigibody 碰撞體Collider 觸發器 is Trigger
碰撞體是物理組件的一類,它要與剛體一起添加到遊戲對象上才能發生碰撞。
碰撞的雙方中一定要有一個有剛體組件存在,並且雙方必有碰撞體組件。
剛體必須在主體上,is Trigger可以是二者之一
is Trigger 開啓時,觸發事件
關閉時,碰撞事件
下面的參數都表示對方
觸發信息檢測:
1.MonoBehaviour.OnTriggerEnter( Collider other )當進入觸發器
2.MonoBehaviour.OnTriggerExit( Collider other )當退出觸發器
3.MonoBehaviour.OnTriggerStay( Collider other )當逗留觸發器
碰撞信息檢測:
1.MonoBehaviour.OnCollisionEnter( Collision collisionInfo ) 當進入碰撞器
2.MonoBehaviour.OnCollisionExit( Collision collisionInfo ) 當退出碰撞器
3.MonoBehaviour.OnCollisionStay( Collision collisionInfo ) 當逗留碰撞器
發生碰撞的主體一定是要帶剛體的,即只有帶剛體的碰撞體去撞其他碰撞體時,雙方纔會收到碰撞事件,以下是實驗:
一、控制A(剛體加碰撞體)撞擊 靜止的B(只有碰撞體),雙方能收到碰撞事件。
二、控制B(只有碰撞體)撞擊 靜止的A(剛體加碰撞體),雙方收不到碰撞事件。
三、讓A(剛體加碰撞體)自由下落,然後控制B(只有碰撞體)去撞擊A,雙方能受到碰撞事件。
得出的結論似乎是如果碰撞雙方只有一個有剛體,那麼那個剛體一定要處於運動的狀態下纔會有碰撞事件發生。
收到觸發事件,必須滿足如下三個條件:
1、必須都要有碰撞器組件(Collider),其實上面的碰撞事件同樣也需要這個前提條件。
2、必須有一個物體帶剛體組件,並且處於運動狀體中(包括主動運動去撞擊別人和在運動過程中被別人撞擊)。
3、兩個碰撞器中至少有一個開啓了IsTrigger。
一、開啓IsTrigger那個物體會被物理引擎鎖忽略掉,所以會產生兩個物體穿越的情況。
二、兩個對象要麼都收到碰撞事件,要麼都收到觸發事件,不會出現一個收到觸發事件,一個收到碰撞事件的情況。
3.碰撞器和觸發器的區別?
碰撞器(Collider)有碰撞效果,isTrigger= false;可以調用OnColliderEnter/Stay/Exit。
觸發器沒有碰撞效果,isTrigger= true; 一個觸發器不會碰撞剛體,當一個剛體進入或者退出觸發器時,將發送:OnTriggerEnter/Stay/Exit。
4.碰撞發生的必要條件?
兩個物體必須帶有碰撞器(Collider),一個物體還必須帶有剛體(RigidBody)或則角色控制器(CharacterController,自帶膠囊碰撞器,已經封裝了一個剛體在裏面)。