- 基础
- 快捷键
- 标准输入
- 坐标系 & 世界坐标系 & 本地坐标系
- Prefab 预设对象/ 预制体
- 刚体 Rigidbody
- 角色控制器 CharacterController
- 碰撞体 Collider
- 射线 Ray
- 播放音频文件 AudioSource
- GUI 按钮
- 预保存 PlayerPrefs
- 资源加载 Resources
- 多场景切换 SceneManager
- 协程
- WWW / UnityWebRequest 网络
- 重要API
- Transform
- 显示或隐藏物体
- 生命周期
- Build 64 位库(arm64-v8a 或 x86_64 的库)支持
- XR(VR AR MR)模式开启和关闭
- 素材网站
- 参考
- 官方API文档有API使用Demo,卡住了别忘记查api
- Unity官方离线API文档
- 脚本生命周期
- 中文Unity API
- Object
- Instantiate 克隆 original 对象并返回克隆对象。
- Destroy 移除 GameObject、组件或资源。
- MonoBehaviour
- GameObject
- Input
- CharacterController
- Object
- 工程目录结构
- Hierarchy 中一切皆 GameObject,一个GameObject 可有若干子 GameObject 。单元 GameObject 由一系列组件 Component 组成,可通过 GetComponent<组件类型>() 获取组件对象,然后对对象进行操作;也可通过 Destroy() 来销毁 GameObject 或 Component。
- 打日志:Debug.Log(xxx); 或 print(xxx);
- QWERT 编辑游戏对象
- Z CENTER工具,改变游戏对象的轴心点
- X LOCAL工具,改变物体的坐标
- CTRL + P 调试播放/结束按钮
- CTRL + SHIFT + P 调试暂停/继续
- CTRL + ALT + P 调试逐帧播放
- ALT + 鼠标左键 旋转视图
- ALT + 鼠标右键 放大缩小视图
- ALT + 鼠标滚轮 移动视图
- W/S/A/D + 鼠标右键 上/下/左/右 飞行浏览视图
- W/S/A/D + SHIFT + 鼠标右键 上/下/左/右 快速飞行浏览视图
- CTRL + TAB 下个窗口
- CTRL + SHIFT + TAB 上个窗口
- CTRL + SHIFT + C CONSOLE 控制台
- CTRL + 1 SCENE 视图
- CTRL + 2 GAME 视图
- CTRL + 3 INSPECTOR 视图
- CTRL + 4 HIERARCHY 视图
- CTRL + 5 PROJECT 视图
- CTRL + 6 ANIMATION 视图
- CTRL + 7 PROFILER 视图
- CTRL + 9 ASSET STORE UNITY 资源商店
- CTRL + 0 ASSET SERVER 资源服务器
Edit > Project Settings… > Input Manager
- Input.GetButtonDown(“Fire1”)
- Input.GetAxisRaw(“Horizontal”) * Time.deltaTime;
- Input.GetKeyDown(KeyCode.Space)
- Input.GetMouseButton(0)
- GetXX / GetXXDown(一帧) / GetXXUp(一帧)
-
坐标系
左手坐标系:大拇指x轴(右)、食指y轴(上)、中指z轴(前)
旋转方向:伸开大拇指,左手抓握某轴正方向,其余四指指向方向为旋转正方向。 -
世界坐标系 (相对所有物体)
Vector3.right,值为 (1, 0, 0)
Vector3.up,值为 (0, 1, 0)
Vector3.forward ,值为 (0, 0, 1) -
本地坐标系 (相对物体本身)
transform.right
transform.up
transform.forward
由若干子GameObject组成,直接把GameObject拖到Prefabs文件夹就可生成了预设对象
刚体 RigidbodyAdd Component > Physics > Rigidbody
描述物体受力的作用。如桌子、凳子
角色控制器 CharacterControllerAdd Component > Physics > Character Controller
描述物体发力作用。如怪兽、人
碰撞体 ColliderAdd Component > Physics > XXX Collider
检测物体的碰撞。
回调函数
-
Collider.isTrigger 不勾选
OnCollisionEnter 碰撞开始帧
OnCollisionStay 碰撞中帧
OnCollisionExit 碰撞结束帧 -
Collider.isTrigger 勾选
OnTriggerEnter 碰撞开始帧
OnTriggerStay 碰撞中帧
OnTriggerExit 碰撞结束帧注意: 两个 GameObjects 都必须包含 Collider 组件。其中一个必须启用 Collider.isTrigger,并包含 Rigidbody。
如果两个 GameObjects 都启用了 Collider.isTrigger,则不会发生碰撞。
如果两个 GameObjects 都没有 Rigidbody 组件,也不会发生碰撞。
Effects > Line Renderer 添加 Material 绘制射线,然后通过脚本获取该 Line Renderer 动态修改其Positions[1] 改变射线经过的点
void FixedUpdate()
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 获取从主摄像机通过光标位置的射线
RaycastHit hit; // 碰撞点相关信息对象
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100f)) // 射线与任何碰撞体相交
print("Found an object - distance: " + hit.distance);
}
if (Physics.Raycast(ray))
Instantiate(particle, transform.position, transform.rotation);
播放音频文件 AudioSource
直接将声音文件拖入相机属性面板,自动添加Audio Source组件。
播放音频:
- audioSource.Play();
- AudioSource.PlayClipAtPoint(clip, Camera.main.transform.position); // 在3d空间某个点播放声音
GUI 块布局;GUILayout 流式布局
if (GUI.Button(new Rect(10, 70, 50, 30), "click")) {}
if (GUILayout.Button(new Rect(10, 70, 50, 30), "click")) {}
预保存 PlayerPrefs
本地数据保存,仅支持 int 、float、string 类型数据保存。保存在注册表?
PlayerPrefs.HasKey("name")
PlayerPrefs.SetString("name", "zhangsan");
PlayerPrefs.GetString("name");
资源加载 Resources
要求:资源文件必须放置在Asset/Resources 目录下,访问时不加文件拓展名
private void OnGUI()
{
if (GUI.Button(new Rect(10, 70, 200, 30), "加载音频资源并播放"))
{
AudioSource.PlayClipAtPoint(Resources.Load("Audios/soundC") as AudioClip, Camera.main.transform.position);
}
}
多场景切换 SceneManager
操作:先将要切换的场景加入 File > BuildSettings... 中
加载场景:SceneManager.LoadScene (Application.LoadLevel 已弃用)
卸载场景:SceneManager.UnloadSceneAsync
LoadSceneMode.Additive :将场景添加到当前加载的场景。
LoadSceneMode.Single :关闭所有当前加载的场景,并加载一个场景。
void Update()
{
if (Input.GetKeyDown(KeyCode.W))
{
// 启动协程,5秒后执行后打印world
StartCoroutine(myfun(5));
}
}
IEnumerator myfun(int seconds)
{
Debug.Log("hello");
yield return new WaitForSeconds(seconds);
Debug.Log("world");
}
WWW / UnityWebRequest 网络
public class WWWTest : MonoBehaviour
{
private Texture image;
private Texture image2;
public string LOGO_URL = "https://profile.csdnimg.cn/1/1/3/3_cuncaojin";
void Start()
{
StartCoroutine(GetImage());
StartCoroutine(GetImage2());
}
IEnumerator GetImage2()
{
using (UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(LOGO_URL))
{
yield return uwr.SendWebRequest();
var texture = DownloadHandlerTexture.GetContent(uwr);
image2 = texture;
}
}
IEnumerator GetImage()
{
WWW www = new WWW(LOGO_URL);
yield return www;
image = www.texture;
}
private void OnGUI()
{
if (image != null)
GUI.DrawTexture(new Rect(100, 100, 100, 100), image);
if (image2 != null)
GUI.DrawTexture(new Rect(300, 100, 200, 200), image2);
}
}
重要API
Transform
- 移动:position、Translate()
- 旋转:Rotate() 、RotateAround(),遵循左手定则,大拇指指向旋转轴正方向,抓住轴,其余四指手指弯曲的方向为旋转的正方向
- 缩放:localScale
- Vector3:表示3维向量,可理解为三维空间的一个点。成员:up/down/left/right/forward/back/zero
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; ///生命周期/// 控制物体的显示或隐藏,不渲染并释放资源方式(active) /// ///GameObject.renderer.enabled /是控制一个物体是否在屏幕上渲染或显示 而物体实际还是存在的 只是想当于隐身 而物体本身的碰撞体还依然存在的 ///GameObject.Destroy() /表示移除物体或物体上的组件 代表销毁该物体 实际上该物体的内存并没有立即释放,而是等到这一帧的结束才会真正销毁 ///GameObject.SetActive() /是否在场景中停用该物体,设置gameObject.SetActive(false),则你在场景中用find找不到该物体 /如果该物体有子物体 你要用SetActiveRecursively(false) 来控制是否在场景中停用该物体(递归的) /SetActive(false)的时候,物体不再渲染,释放占用资源 ///Camera.cullingMask /设置相机的渲染层次,在不需要某个物体的时候,cullingMask中将此物体的layer去掉,但是前提是要规划好layer,不能影响其他不希望隐藏掉的物体。 ///GameObject.transform.position = FAR_AWAY /设置一个无限远的位置,再不需要的时候就将物体移动至这个位置,但是这样物体并没有释放,占用的所有资源都会继续占用 /// public class ShowHideUtil { ////// 显示或隐藏物体 /// /// /// public static void Show(GameObject go, bool isShow) { if (go == null) { throw (new NullReferenceException("Show method arg go is null error")); } go.SetActive(isShow); } ////// 切换物体自身的显示或隐藏状态 /// /// 要显示或隐藏的游戏物体 public static void SwitchSelfShowHideState(GameObject go) { if (go == null) { throw (new NullReferenceException("SwitchSelfShowHideState method arg go is null error")); } go.SetActive(!go.activeSelf); } ////// 切换物体在层级中的显示或隐藏状态 /// /// 判断该物体是否已激活可用 public static bool IsActiveInHierarchy(GameObject go) { if (go == null) { throw (new NullReferenceException("IsActiveInHierarchy method arg go is null error")); } return go.activeInHierarchy; } ////// 将自身到根父物体所有物体激活可用,它们的状态均切换为显示或隐藏,子物体不处理 /// /// ///public static void ShowOrHideToRoot(GameObject go) { if (go == null) { throw (new NullReferenceException("ShowOrHideToRoot method arg go is null error")); } bool isShow = go.activeInHierarchy; go.SetActive(!isShow); while (null != go.transform.parent) { GameObject tempGameObject = go.transform.parent.gameObject; tempGameObject.SetActive(!isShow); go = go.transform.parent.gameObject; } } /// /// 将自身及所有子物体激活可用,但不一定显示,如父物体不显示则依然不显示。 /// /// ///public static void SetActiveRecursively(GameObject go) { if (go == null) { throw (new NullReferenceException("SetActiveRecursively method arg go is null error")); } go.SetActiveRecursively(!go.activeInHierarchy); } }
Build 64 位库(arm64-v8a 或 x86_64 的库)支持https://docs.unity.cn/cn/2019.4/Manual/ExecutionOrder.html
https://docs.unity3d.com/Packages/com.unity.xr.management@4.0/manual/EndUser.html
XR 是一个统称,包括以下类型的应用程序:
虚拟现实 (VR):这种应用程序模拟一个用户周围完全不同的环境。
混合现实 (MR):这种应用程序将其自身的环境与用户的现实环境相结合,并允许彼此交互。
增强现实 (AR):这种应用程序在现实世界的数字视图上将内容分层。
- www.turbosquid.com 157密
- 中文Unity API
- Unity中让游戏对象消失或隐藏的几种方法



