aser自学u3d一段时间的总结
1. 音频播放
1.1 使用 AudioSource.PlayOneShot 播放音频剪辑
audio.PlayOneShot(getSound);
此方法用于播放一个音频剪辑,使用该方法前必须为对象添加音频源组件。
1.2 使用 AudioSource.PlayClipAtPoint 在指定位置播放剪辑
AudioSource.PlayClipAtPoint(getSound, transform.position);
该方法可在指定位置播放剪辑,播放完成后会自动消除音频源,且不需要为对象添加音频源组件。
2. 修改光源颜色
public Light doorLight;
doorLight.color = Color.red;
通过上述代码可以将指定光源的颜色修改为红色。
3. 通过物体名查找 GameObject
GameObject.Find("powerTxt").GetComponent<GUIText>();
GameObject.Find("powerTxt").GetComponent("GUIText") as GUIText;
查找操作一般放在 Start 函数中,并将结果赋值给某个变量。因为 Find 方法会在所有游戏物体中进行查找,需要遍历,会浪费性能,所以最好不要在 Update 方法中使用该方法。
4. 光线投射(用于碰撞检测)
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.forward, out hit, 3))
{
if (hit.collider.transform.tag == "playerDoor")
{
hit.collider.SendMessage("openMyDoor");
}
}
Physics.Raycast 方法有四个参数,分别为射线的起点、方向、用于存储碰撞信息的变量和射线的长度。如果该方法返回 true,hit 变量将包含碰撞的更多信息。
5. SendMessage 方法
cube.SendMessage("addSum1", 10);
该方法用于执行游戏物体脚本中的指定函数。
6. Time.deltaTime
Time.deltaTime 是以秒为单位计算完成每一帧所花费的时间。
7. 播放动画
animation.Play("doorshut");
使用上述代码可以播放指定名称的动画。
8. 角色控制的碰撞检测
void OnControllerColliderHit(ControllerColliderHit hit)
当角色控制器在移动过程中碰撞到碰撞体时,OnControllerColliderHit 方法会被调用。
9. 销毁游戏物体
Destroy(gameObject, 1);
该方法用于销毁游戏物体,第二个参数为可选的延迟销毁时间。
10. 游戏物体旋转
transform.Rotate(0, Time.deltaTime * 100, 0);
通过上述代码可以让游戏物体绕 Y 轴进行旋转。
11. 触发碰撞
void OnTriggerEnter(Collider coll)
要使用触发碰撞,需要将碰撞体的 is Trigger 属性选中。
12. 游戏物体的移动
12.1 xy 方向的移动
moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
12.2 结合 Time.deltaTime 和速度的移动
float x = Input.GetAxis("Horizontal") * Time.deltaTime * speed;
float z = Input.GetAxis("Vertical") * Time.deltaTime * speed;
transform.Translate(x, 0, z);
13. 检查键盘按键是否按下
Input.GetKey(KeyCode.W) // 按下返回 true
使用 Input.GetKey 方法可以检查键盘上指定的键是否被按下。
14. 复制预设并添加力
Transform n = Instantiate(zidan, transform.position, transform.rotation) as Transform;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
n.rigidbody.AddForce(fwd * 1000);
上述代码可以复制一个预设对象,并为其添加一个向前的力,使其产生物理运动。
15. 脚本的启用和禁用
GetComponent<Main>().enabled = false;
GameObject.Find("Plane").GetComponent<Restart>().enabled = true;
第一行代码用于禁用当前对象上的 Main 脚本,第二行代码用于启用 Plane 物体上的 Restart 脚本。
16. UI 绘制
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");
}
}
所有的 UI 绘制操作都可以在 OnGUI 方法中处理。
17. 加载纹理
transform.renderer.material.mainTexture = Resources.Load("0") as Texture;
通过上述代码可以加载一个纹理并将其赋值给游戏物体的材质。
18. 加载文件夹里的序列图
private Object[] anim;
anim = Resources.LoadAll("juese");
该方法用于加载 Resources 文件夹下指定文件夹中的所有资源,并将其存放到一个数组中。注意,juese 为文件夹名,必须放在 Resources 文件夹下。
19. 修改文字字体和颜色
要修改文字字体,可以创建一个 GUISKIN,在这个 GUISKIN 中修改字体,然后使用 GUI.skin = mySkin; 进行设置。同时,可以使用 GUI.color = Color.red; 来设置文本颜色。
20. 让序列图动起来
//--------------------动画开始---------------------------------
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;
}
}
//--------------------动画结束---------------------------------
21. 输入文本和密码文本
userName = GUI.TextField(new Rect(400, 70, 200, 30), userName, 10);
pwd = GUI.PasswordField(new Rect(400, 100, 200, 30), pwd, "*"[0], 20);
第一行代码用于创建一个输入文本框,第二行代码用于创建一个密码输入框。
22. C# 和 js 互相调用
22.1 准备工作
首先删掉 #pragma strict 严谨编译模式,将 js 文件放在 Plugins 文件夹中。编译顺序为:先编译 Plugins 中的代码,然后是 Editor 代码,最后是其它代码。
22.2 js 调用 C
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);
}
22.3 C# 调用 js
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);
}
23. 等待方法
Debug.Log("开始等待:" + Time.time);
yield return new WaitForSeconds(3);
Debug.Log("结束等待:" + Time.time);
WaitForSeconds 方法用于通知游戏主线程等待一段时间,使用该方法时,必须将其所在的方法返回类型修改为 IEnumerator。
24. 随机数生成
int a = Random.Range(0, 100);
float b = Random.Range(10.0f, 100.0f);
上述代码分别用于生成一个 0 到 99 的随机整数和一个 10.0 到 100.0 的随机浮点数。
25. Update 和 FixedUpdate 方法
Update 方法会在每次渲染新的一帧时被调用,而 FixedUpdate 方法会在每个固定的时间间隔被调用,不受帧率变化的影响。这个固定的时间间隔可以在 Edit -> Project Setting -> Time 下面的 Fixed timestep 中进行设置。因此,处理 Rigidbody 时最好使用 FixedUpdate 方法。
26. 在 Unity 中添加新的菜单
using UnityEditor;
[MenuItem("新的菜单/fuck")]
static void DoSomething()
{
Debug.Log("Perform operation");
}
通过上述代码可以在 Unity 中添加一个新的菜单,并为其添加相应的操作。
27. 抗锯齿设置
在 3D 渲染过程中,可能会出现锯齿,这是因为为了提高运行效率而牺牲了渲染效果,锯齿越多说明渲染效率越快。可以在 Edit -> ProjectSettings -> Quality 中的 Anti Aliasing 选项中设置抗锯齿。
28. 摄像机
Camera.active = true; // false
通过上述代码可以激活或禁用摄像机。
29. 刚体(Rigidbody)
29.1 质量(Mass)
质量数值越大,物体下落的速度越快。
29.2 阻力(Drag)
阻力会影响物体的运动速度。
29.3 是否使用重力(Use Gravity)
该属性用于控制刚体是否受到重力的影响。
29.4 是否受物理影响(Is Kinematic)
该属性用于控制刚体是否受到物理模拟的影响。
30. 碰撞与休眠
刚体与物体之间存在碰撞,刚体的碰撞分为进入碰撞、碰撞中、碰撞结束三种状态。休眠可以理解为让模型变为静止状态。
30.1 开始接触时调用
OnCollisionEnter()
30.2 碰撞过程中每帧调用
OnCollisionStay()
30.3 停止接触时调用
OnCollisionExit()
31. 碰撞器
游戏对象要感应碰撞,必须为其添加碰撞器。常见的碰撞器有:
Box Collider(盒子碰撞器)Sphere Collider(球体碰撞器)Capsule Collider(胶囊碰撞器)Mesh Collider(网格碰撞器)Wheel Collider(车轮碰撞器)