Name
object.Destroy(建议用这个,不会被立刻回收,放在垃圾池里,再同意销毁)
Object.DestroyImmediate(立刻销毁,可能会导致控制帧)
destroy(**,5),可以设定销毁时间
DontDestroyOnLoad, 在场景切换的时候,这个游戏物体,始终存在(可以用来设置共享物体)
FindObjectOfType
根据组件类型,查找组件,在全局里进行搜索,只找第一个就返回,不会去找多个
- FindObjectsOfType
可以查找场景里所有的组件,然后返回数组,不查找未激活组件 - 以上都是静态方法
- 静态方法就是通过类名来调用
Gameobject.Find(性能耗费特别高,不要用在update里)
Gameobject.FindGameObjectsWithTag(查找所有有这个标签的物体,性能耗费低一些)
Gameobject.FindWithTag(查找第一个有这个标签的物体,性能耗费低一些)
- gameobject和component的禁用方法不一样,
gameobject, 用SetActive(false)
component,用enabled. - unityexception(没有设置标签)
- nullexception(标签没有查找到)
- BroadcastMessage,广播后,所有的孩子都可以接收到这个消息,但是他本身不需要知道接受者是谁(只要看孩子的身上是不是有方法名),可以降低耦合性。
- 没有接受者,就无法接收,
target.BroadcastMessage("Attack", null, SendMessageOptions.DontRequireReceiver);//不一定需要接受者,这样就不会报错了
14.直接在物体上,挂一个同名方法就好,这样就能直接叫到,避免多重耦合的情况。(孩子都会被调用) - sendMessage(只会针对物体一个,不会去叫他的孩子)
- sendMessageUpwards(和BroadcastMessage相反,用孩子去叫祖先)
- [ExecuteInEditMode],在编辑模式下,也能运行(加在特定的类上就行)
- Invoke(), 就是调用方法
- Coroutine,携程部分
- InvokeRepeating(),对某个方法进行间隔调用
- Invoke,不会影响别的脚本
- 没有update(),就不会被禁用
- Invoke,会将方法添加在队列里面然后等待着,IsInvoking会去队列里面寻找,是不是被调用着。调用了以后,就会从队列里移除。
协程:如果调用的是一个协程方法,那么调用完协程方法后,不会等这个方法执行完,就继续向下执行了。
普通:如果执行的是一个普通方法,那么会等这个普通方法执行完,然后继续向下执行
协程不会阻塞程序的执行,同时,可以在执行过程中进行暂停。
...
cube.GetComponent<MeshRenderer>().material.color
...
把组件里面的meshrender拿出来
...
Coroutines
1. 返回值是IEnumerator
2. 返回参数的时候是使用yield return null/0;
3. 调用方式:StartCoroutine(Method()); 再封装一次,开启协程,不确定谁会先运行
...
- 协程的关闭方式,两者开启和关闭的方式需要意思一样的
...
private IEnumerator ie;
if (Input.GetKeyDown(KeyCode.Space))
{
ie = Fade();
StartCoroutine(ie);
}
if (Input.GetKeyDown(KeyCode.S))
{
StopCoroutine(ie);
}
...
默认时候,OnMouseUp这些都能做检测,都能检验出来
但如果有了trigger,就一定要保证project setting里的physcis->queries hit triggers为true
enter, over, exit与鼠标按不按下无关,down,drag, up这些是有关的
OnMouseAsButton,必须要保证,按下和抬起是同一个物体才会触发
Epsilon, Infinity
leap能做速度有变化的动画(先快后慢),看起来有幻影,每次移动都是恒定比例,不是恒定数值
mathf.lerp(x,10, Time.deltaTime):按照真的时间去控制运行
mathf.LerpAngle
mathf.MoveToWards,匀速运动
Mathf.PingPong
input和mathf一样,都是静态方法
Input.imeselected,和输入法有关
-
GetKey,会一直监听。GetKeyUp/Down都只会触发一次
40.Conventional Game Input(名字列表),Input.GetKey("直接输入名字")
-
GetKey 和 GetMouseButton都是实打实的按键,GetButton是指虚拟按键(我们自己定义的按键),alt就表示备用的键,虚拟按键的好处就是,1)一个button键,可以对应多个按键 2)名字任意命名,所以比较形象
Input.GetButtonDown("Horizontal"),对轴的话,一般不会去监测按下和抬起
GetAxis,直接拿渐变的值,可以模拟加速运动,cube.Translate(Vector3.right * Time.deltaTime*Input.GetAxis("Horizontal"));
GetTouch,多指触摸,可以直接用esayTouch,更快
acceleration,这个可以用来检测重力,检测陀螺仪,检测手机倾斜角度
46.anykey(鼠标+键盘)都可以识别和触发mousePositon,像素位置
Camera.main.ScreenPointToRay(); 鼠标射线,这样可以去检测是否点到了游戏物体
vector2, 可以表示二维向量,也可以表示二维坐标(下,-y, 上 y;左,-x,右 x)
-
sqrMagnitude,还未开根号之前,这样出来的计算量小一些(性能优化)
...
void Start () {
print(Vector2.down);
print(Vector2.up);
print(Vector2.left);
print(Vector2.right);
print(Vector2.one);
print(Vector2.zero);Vector2 a = new Vector2(2, 2); Vector2 b = new Vector2(3, 4); print(a.magnitude); print(a.sqrMagnitude); print(b.magnitude); print(b.sqrMagnitude); print(a.normalized);//不会对a有影响,只是返回了一个单位值 print(b.normalized); print(a.x + "," + a.y); print(a[0] + "," + a[1]);
}
... vector2/3,他们俩都是结构体,不是类,结构体就相当于把一堆变量做封装
a=Vector2.MoveTowards(a, target, Time.deltaTime);
Vector3
- vector3.Slerp:在AB之间进行差值,ab是两个向量,不是位置,按照夹角、长度来进行差值(适合做转向,转得平滑)
Random
- random.range//生成范围,不包含最大值
- random,静态方法就直接通过类名来调用就好
- random.IniState, 初始化随机种子,unity会自动默认每次生成的数字都不一样,所以inistate可以爱写不写
- random.value//直接就是0-1,可以用来做颜色RGB生成
- Random.State;//只要是拿种子
- Random.Rotation;//用来控制四元数旋转,朝向
- Random.insideUnitCircle;//在长度为1的圆里,随机生成各种二维坐标
Quaternion
- x,z轴做自身绕轴旋转,y轴是绕着世界坐标做旋转
- 欧拉角(方便观察)+四元数(方便计算)
- print(cube.rotation);//这是四元数
- cube.rotation = Quaternion.Euler(new Vector3(45, 45, 45));
- Quaternion. LookRotation
- Quaternion.Slerp//跟角度的话,一般都推荐s打头
RigidBody
- RigidBody. centerOfMass
- RigidBody.Position,通过刚体组件来修改位置的话,transform会在下一步更新,性能更高,比transform.position更快
- 直接用move.position,还是这个比较好,会更平滑
...
playerRgd.position = playerRgd.transform.position + Vector3.forward * Time.deltaTime;//简单的几次没有问题
playerRgd.MovePosition(playerRgd.transform.position + Vector3.forward * Time.deltaTime*10);//如果是多次改变,就用这个
... - 通过刚体直接来修改rotation,就会更加快,效果会更好,更节约性能
- MoveRotation, MovePosition
Camera
-
Camera组件的获取方式
...
public class API16Camera : MonoBehaviour {private Camera mainCamera;
// Use this for initialization
void Start () {
mainCamera=GameObject.Find("MainCamera").GetComponent<Camera>();
mainCamera = Camera.main;//直接用过tag来查找,但是这个就要保证tag不能变
}// Update is called once per frame
void Update () {}
}
... 利用鼠标射线,探究鼠标与物体的碰撞方式
...
void Update () {
Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
bool isCollider= Physics.Raycast(ray, out hit);
if (isCollider)
{
Debug.Log(hit.collider);
}
}
...显示射线方向
Debug.DrawRay(ray.origin, ray.direction * 10, Color.yellow);
射线的起点在屏幕上
Application
-
dataPath
-
Streaming Assets
声音文件之类的,可以用datapath去查找
里面资源不会被打包,放的是什么路径,读取的时候就是什么路径,不会被做成unity的格式,资源不会被合并
-
各种目录
...
void Start () {
print(Application.dataPath);//返回工程所在目录
print(Application.streamingAssetsPath);//文件流读取数据
print(Application.persistentDataPath);//可以固有化数据
print(Application.temporaryCachePath);//临时目录数据
}
...
-
Application下常用变量(多静态)
companyName
identifier(用来表示包名)
installName
installMode
isEditor
isFocused
isPlaying
platform
RuntimePlatform//判断当前的平台
isPlaying
Quit
OpenURL
79.Application,做各种自我判断
...
void Start () {
print(Application.identifier);
print(Application.companyName);
print(Application.productName);
print(Application.installerName);
print(Application.installMode);
print(Application.isEditor);
print(Application.isFocused);
print(Application.isMobilePlatform);
print(Application.isPlaying);
print(Application.platform);
print(Application.unityVersion);
print(Application.version);
print(Application.runInBackground);Application.Quit();//build出来之后使用的 Application.OpenURL("www.sikiedu.com"); ScreenCapture.CaptureScreenshot("游戏截图");
}
// Update is called once per frame
void Update () {
if (Input.GetKeyDown(KeyCode.Space))
{
UnityEditor.EditorApplication.isPlaying = false;//只能在编译器情况下使用
}
}
...
scene
-
AsycOperation.progress
-
SceneManager