目录
Update()、FixedUpdate()和LateUpdate()的区别
操作知识
角色移动(方法一)
gameObject.transform.Translate(Time.deltaTime * Speed, 0, 0);
//右移,其中Speed为float类型变量,后两个参数分别是竖直方向和图层前后方向
GameObject.Find("player").transform.Translate(Time.deltaTime * Speed, 0, 0);
//寻找名字为"Player"的对象,并让它移动
//但是当对象过多时,会耗时很多
//此方法是让物体每次都向目的方向瞬间平移一定距离,无视碰撞
//所以在撞到边缘之后会出现不停抖动的情况,不推荐使用
角色移动(方法二)
transform.GetComponent<Rigidbody2D>().AddForce(Vector2.right*100);
//瞬间给当前物体施加一个水平向右的力使其速度为100
//此方法适用于普通的物理物体,但是由于速度会叠加,没有最大速度
//且方向控制很麻烦,也不推荐使用
角色移动(方法三)
Rigidbody2D Player;
float Speed = 600f;
void Start() {
Player = transform.GetComponent<Rigidbody2D>();
}
void Update () {
Player.velocity = new Vector2(Speed, Speed); //分别为水平方向和竖直方向的速度
}
//这个方法最好,不但速度稳定检测碰撞而且改变速度方便迅速,推荐移动角色时使用
角色移动(方法四)
Vector2 Speed = new Vector2(1, 0); //设置速度方向和大小
public Rigidbody2D rigidbody;
void FixedUpdate() {
rigidbody.MovePosition(rigidbody.position + speed * Time.deltaTime);
}
//每次都是瞬间移动过去再判断是否有碰撞器的,当速度过大时可能会穿过其它碰撞器
方向键操控角色
//写在Update函数里
float BallX = Input.GetAxis("Horizontal"); //改为“Vertical”即竖直方向
if (BallX ==1) {
//向右移动的代码
}
if (BallX ==-1) {
//向左移动的代码
}
//但是我发现它最后有一点延迟,原因不明,就不喜欢用
更改角色Sprite
//初始化(可以写在Start函数里)
SpriteRenderer Player;
public Sprite Picture; //Inspector界面拖拽Sprite赋值
Player = this.GetComponent<SpriteRenderer>();
//更改Sprite
Player.sprite = Picture;
获取对象速度
Rigidbody2D Player;
Player = GetComponent<Rigidbody2D>(); //获取当前的物理物体对象
float Speed = Player.velocity.magnitude;
获取对象位置
Vector3 Pos = transform.position;
//把对象位置赋值给Pos(包含图层一共三个数据)
//可用Pos.x Pos.y Pos.z调用
//或者这样写:
Vector3 Pos = gameObject.transform.position;
复制对象
Instantiate(Transform, new Vector2(0,0), Quaternion.identity);
//Transform处写该类型的变量名一般可以public定义,然后拖拽赋值
//第二个参数是新对象的位置
销毁对象
Player.gameObject.SetActive(false);
//Player为对象名字
鼠标(手指)对对象的操作
void OnGUI() {
if (Event.current.type == EventType.MouseDown) {
//这里写鼠标按下(屏幕触摸按下)对象的代码
}
if (Event.current.type == EventType.MouseDrag) {
//这里写鼠标拖动(屏幕触摸滑动)对象的代码
}
if (Event.current.type == EventType.MouseUp) {
//这里写鼠标抬起(屏幕触摸抬起)对象的代码
}
}
获取鼠标光标位置
Pos = Event.current.mousePosition;
//获取当前光标位置,其中横坐标和纵坐标分别是Pos.x和Pos.y,原点在左上角,单位为1像素
隐藏鼠标光标
Cursor.visible = false; //隐藏
Cursor.visible = true; //显示
播放音频
AudioSource.PlayClipAtPoint(AudioClip, transform.localPosition);
//AudioClip就是音频变量,赋值后就可以用了
Sleep(休眠)
Thread.Sleep(100);
//在文件开头要加上导入语句:
using System.Threading;
读写存档变量
PlayerPrefs.SetInt("读取对象的名字", a); //把a的值写入存档里
int a = PlayerPrefs.GetInt("读取对象的名字"); //读取存档值,赋值给a
删除变量存档
PlayerPrefs.DeleteAll(); //删除所有存档
PlayerPrefs.DeleteKey("这里是删除对象的名字"); //删除指定key对应的信息
按Esc退出游戏
void Update() {
if (Input.GetKeyDown(KeyCode.Escape)) {
Application.Quit();
}
}
加载其它场景(Sence)
SceneManager.LoadScene("场景名");
响应键盘按键函数
if (Input.GetKey(KeyCode.LeftArrow)) { //按左向键
//这里写事件代码
}
//KeyCode里包含了基本所有按键
角色发生碰撞(接触)事件函数
void OnCollisionEnter2D(Collision2D c) { //重载,可以没有参数
if (c.gameObject.name == "碰撞对象的名字") {
//这里写操作代码
}
}
鼠标相关函数
//针对脚本对应的对象
void OnMouseUp() { } //鼠标左键抬起(屏幕触摸抬起)
void OnMouseDown() { } //鼠标左键按下(屏幕触摸按下)
void OnMouseEnter() { } //鼠标光标指向
void OnMouseExit() { } //鼠标光标移开
触发器常用函数
void OnTriggerStay() { } //player持续Trigger触发事件
void OnTriggerEnter() { } //player触碰Trigger触发事件
void OnTriggerExit() { } //player离开Trigger触发事件
显示图片
void OnGUI() {
GUI.DrawTexture(new Rect(Posx,Posy,Weight,Height), Texture);
//Texture为图片类型,位置为(Posx,Posy),尺寸为Weight * Height (像素)
}
显示文字
void OnGUI() {
GUIStyle fontStyle = new GUIStyle(); //设置字体变量
fontStyle.normal.textColor = new Color(R,G,B); //R,G,B都在(0,1)之间
fontStyle.fontSize = 100; //字体大小
GUI.Label(new Rect(Posx,Posy,Weight,Height), "hello" , fontStyle); //显示文本
}
代码知识
求绝对值
int ans = Math.Abs(num); //求整数num的绝对值,赋值给ans
float ans = Mathf.Abs(num); //求浮点数num的绝对值,赋值给ans
求开方
float ans = Mathf.Sqrt(a);
//求a的开方,并赋值给ans
定义数组
int[] a = new int[4]; //定义长度为4的一维数组a
int[,] a = new int[4, 4]; //定义4*4的二维数组a
int[] a=new int[5]{1,2,3,4,5}; //定义并初始化一维数组a
int[] a={1,2,3,4,5}; //定义并初始化一维数组a
定义二维向量坐标
Vector2 a = new Vector2(10, 10);
//定义a,并赋值
队列使用
//需要在开头加:
using System.Collections.Generic;
//队列名为q,类型可改
Queue<int> q = new Queue<int>();
//进入队列
q.Enqueue(a); //变量a的值进入队列
//统计队列长度
int size = q.Count; //把长度赋值给size;
//取出元素
int a = q.Peek(); //取出队尾元素,赋值给a
int a = q.Dequeue(); //取出队尾元素,赋值给a,并删除队尾元素
TrimExcess(); //重新设置队列容量,删除Dequeue后的元素
Clear(); //清空队列
调试打印输出
Debug.log(a); //输出a的值(只能有一个参数)
print("哈哈哈"+a); //可以输出变量字符串叠加,中间用“+”连接
读写其他脚本的变量
//假设脚本一的文件名为Script1,先在第一个脚本将需要扩展的变量定义为public,如
public static int a = 10;
//在第二个脚本中可以用Script1.a来使用并更改这个变量的值,如
int ans = Script.a;
//修改同理,如
Script.a=20;
使用其他脚本的函数
//假设被调用函数的脚本名为Script1,且被调用的函数为:
public static void Sum() {
//函数内容
}
//那么在其他脚本使用该函数时写作:
Script1.Sum();
技术探讨
方括号的几种用法
/*变量序列化*/
[SerializeField]
int a; //这里,a只需在Inspector窗口中赋值一次,以后打开项目i都会有初始值了,这就叫序列化
//对于加了public的变量就不需要了,会自动序列化的,而对于private变量则需要加上才能序列化
[NonSerialized]
public int a; //这里,a不会被序列化,Inspector窗口不会显示该变量
[HideInInspector]
public int a; //这里,a会被序列化,但是Inspector窗口不会显示,顾名思义只是被隐藏起来了
/*使Component菜单下出现自定义的类*/
[AddComponentMenu("XXX/XXX/XXX")] //其中的“/”用来分割父类和子类
/*运行前执行脚本*/
[ExecuteInEditMode]
//这里写类
执行情况:
1.当场景中的某个物体发生变化时调用Update函数
2.当GameView接收到一个Event时调用ONGUI函数
3.当SceneVidw或者GameView重绘时调用OnRenderObject和其他的渲染回调函数
4.当加载时调用Awake函数
5.当第一次激活时调用Start函数
6.当该MonoBehavior在编辑器中被赋于给GameObject的时候调用Awake、Start函数
7.当Play按钮被按下游戏开始后调用Awake、Start函数
8.当Play按钮停止后调用Awake、Start函数
9.当在编辑器中打开包含有该MonoBehavior的场景的时候调用Awake、Start函数
/*在添加脚本的时候会自动添加写上去的属性*/
[RequireComponent(typeof(ClassName))] //ClassName即为属性名,比如Rigidbody
Update()、FixedUpdate()和LateUpdate()的区别
Update() 每一帧的时间不固定,受当前渲染的物体影响
FixedUpdate() 固定的时间间隔调用,故物理属性的更新操作应它,这样表现效果会更平滑逼真。
其时间间隔可以在项目设置中更改:Edit->Project Settings...->Time->Fixed Timestep
LateUpdate() 在所有Update函数调用后被调用,跟随物体的摄相机用它效果最好,可防止瞬移和抖动
Awake()和Start()的区别
Awake()先于Start()执行。
使用方法:
在Awake()中获取游戏对象或者脚本实例的信息
在Start()中进行一些获取之后的初始化设置
最近依次更新时间:2019.09.15