Unity 2D游戏基本知识笔记

目录

操作知识

角色移动(方法一)

角色移动(方法二)

角色移动(方法三)

角色移动(方法四)

方向键操控角色

更改角色Sprite

获取对象速度

获取对象位置

复制对象

销毁对象

鼠标(手指)对对象的操作

获取鼠标光标位置

隐藏鼠标光标

播放音频

Sleep(休眠)

读写存档变量

删除变量存档

按Esc退出游戏

加载其它场景(Sence)

响应键盘按键函数

角色发生碰撞(接触)事件函数

鼠标相关函数

触发器常用函数

显示图片

显示文字

代码知识

求绝对值

求开方

定义数组

定义二维向量坐标

队列使用

调试打印输出

读写其他脚本的变量

使用其他脚本的函数

技术探讨

方括号的4种用法

Update()、FixedUpdate()和LateUpdate()的区别

Awake()和Start()的区别





操作知识


角色移动(方法一)

gameObject.transform.Translate(Time.deltaTime * Speed, 0, 0);
//右移,其中Speed为float类型变量,后两个参数分别是竖直方向和图层前后方向

GameObject.Find("player").transform.Translate(Time.deltaTime * Speed, 0, 0);
//寻找名字为"Player"的对象,并让它移动
//但是当对象过多时,会耗时很多

//此方法是让物体每次都向目的方向瞬间平移一定距离,无视碰撞
//所以在撞到边缘之后会出现不停抖动的情况,不推荐使用

角色移动(方法二)

transform.GetComponent().AddForce(Vector2.right*100);
//瞬间给当前物体施加一个水平向右的力使其速度为100

//此方法适用于普通的物理物体,但是由于速度会叠加,没有最大速度
//且方向控制很麻烦,也不推荐使用

角色移动(方法三)

Rigidbody2D Player;
float Speed = 600f;
void Start() {
    Player = transform.GetComponent();
}
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();

//更改Sprite
Player.sprite = Picture;

获取对象速度

Rigidbody2D Player;
Player = GetComponent();     //获取当前的物理物体对象
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 q = new Queue();

//进入队列
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

你可能感兴趣的:(C#和unity)