- 音频
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,自带胶囊碰撞器,已经封装了一个刚体在里面)。