aser自学u3d一段时间的总结

2015年03月15日 11:10 0 点赞 0 评论 更新于 2017-05-04 01:04

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 方法有四个参数,分别为射线的起点、方向、用于存储碰撞信息的变量和射线的长度。如果该方法返回 truehit 变量将包含碰撞的更多信息。

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. UpdateFixedUpdate 方法

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(车轮碰撞器)

作者信息

boke

boke

共发布了 1025 篇文章