unity个人总结

鉴于自己在新手练习项目中踩过的坑所得的小结(仅限于unity2D)

主要属性

Transform

变换。GameObject的基本固有属性。包括当前位置Position,旋转Rotation,和物体大小(形状)Scale三个属性。值得注意的是在脚本中修改GameObject的以上属性时不能直接引用修改。
原因是position是一个Vector3类型的属性,而Vector3是一个结构体,所以position是一个结构体,结构体是一个值类型,值类型在方法传递时只传递值的副本,简而言之直接修改transform.position.x时修改的是副本
例如要将GameObject移至x=3时,不能直接赋值transform.position.x = 3;,而应该用下面其中一种方法:

  • 新建一个Vector3并赋值到transform.position
    transform.position = new Vector3(3, transform.position.y);
  • 新建一个中间变量,将中间变量赋值后再将中间变量赋值给transform.position
Vector3 pos = new Vector3(3, transform.position.y);
transform.position = pos;

Rigidbody_2D

2D刚体,使GameObject拥有除碰撞(体积)之外2D物体的所有属性,包括重力,移动(可操纵性)等。一般来说配合碰撞盒可使选定的GameObject具有基本的物理属性。

Box_Collider_2D

碰撞盒,使GameObject具有可碰撞属性,一般用于人物,地形。正常来说具有刚体属性的物体一般都会加上碰撞盒属性,而具有碰撞盒属性的物体不一定需要刚体属性(如地形则不需要加上刚体)。碰撞盒中有触发器(Is_Trigger)选项,勾选后该碰撞盒失去实体碰撞属性而获得触发属性。触发指该碰撞盒在与鼠标,另一碰撞盒或者另一触发器有接触时返回一个值。游戏中鼠标动画的改变或者怪物的仇恨值等都可以用碰撞器实现。

Sprite_Renderer

渲染器。主要渲染GameObject使其在屏幕中出现,可在此改变GameObject的材质(视觉)。

Animator

动画控制。可在其中的Controller选择或创建状态机,实现GameObject在不同状态下通过设定的属性的改变使其动画改变(当速度大于0.1时由站立到跑之类)
创建动画:Window->Animation->Animation,选定GameObject在窗口中间(该GameObject之前没有动画)或者左上角(该GameObject之前已经有一个或以上动画)create,选定图片拖进时间轴。

地形铺设

创建

在2D中无论是背景还是实体地形都以TileMap形式搭建(个人理解为像是一片一片的瓷砖拼接而成),在unity的2018.4.11f1版本中可以在GameObject->2D_Object->TileMap中创建相应图层,或者在Hierarchy中直接右键2D_Object->TileMap创建,再按需在图层中创建背景和实体地形图层。

整图分割

需要将整图分割成n*m的小方块时,选中图片,在Sprite_Mode中将Single变成Multiple,打开Sprite_Editor->Slice,按需将图片切割。

地形和背景

上文已经分好了地形图层和背景图层,背景图层只需将TileMap铺好就行了,而地形图层,因为与玩家有实际的交互,则需加上Box_Collider_2D,而且因为只需要有接触,所以刚体就没有必要加了。

铺设

打开Window->2D->Tile_Palette,将分割好的图片拖进Tile_Palette,选定方格和上排从左往右第三个的涂抹工具即可在场景中铺设,遇到图片大小和方格不匹配的情况时,观察图片的原分辨率并依照比例修改Pixels _Per_Unit(每方格的像素)即可。

简述Script

GameObject引用

首先已知最基础的public声明的方法和属性可以被外部调用,private声明的方法和属性只能在本类中被调用,外部看不到。所以我们可以在void Start()之前先用public声明所需要的组件,然后在unity界面选定或改动。

获取玩家鼠标键盘输入

获取玩家输入可以用到Input.系列函数
常见的wasd和方向键可以用Input.GetAxisRaw("string axisName"),括号内字符有Horizontal,Vertical,Jump等,所有字符及其关联键位可以在Edit->Project_Settings中查看和修改。
常见的鼠标输入可用Input.GetMouseButton(button:int),括号内可填0,1,2,0对应左键,1对应右键,2对应中键。
GetAxis和GetAxisRaw区别:前者返回一个逐渐变化的值,后者返回一个值。例如按下方向键右,GetAxis返回的是从0变1的逐渐变大的值,反映到速度上就是逐渐加速到给定速度,GetAxisRaw则直接返回1,反映到速度上就是直接到给定速度。

GameObject速度

一般来说游戏的设定是无论在什么设备上运行,游戏内GameObject的移动速度给玩家的感觉是相同的,如果使用的是void Update(),前一帧和后一帧的渲染时间不一定相同,有可能导致GameObject运动不平滑,而FixedUpdate是以固定的时间间隔执行,所以处理Rigidbody时一般要用FixedUpdate。
同时GameObject的速度也与帧率有关,同上,如果直接用给定速度可能会使GameObject出现运动不平滑的现象,所以我们可以用(给定速度*time.deltatime)的方法使GameObject实现我们想要的运动,time.detlatime的意义是经历过一帧耗费的时间,因为同一设备中帧率是不变的,(经历过一帧耗费的时间*帧率==1s)等式恒成立,所以就可以保证在不同的设备上GameObject在1s内运动的距离是相等的,也就确保了其速度是相等的,这就是time.detlatime的用处。

GameObject动画状态改变

假设前面已声明public Animator anim;并且在unity中已绑定状态机,则可以使用anim.SetFloat(string name, float value);函数,string_name指状态机中改变GameObject动画的条件(如速度,方向等),float_value指该条件的新值,通过改变条件的值实现动画状态的改变。如果条件是布尔值则用anim.SetBool(string name, bool value);

更多文章详见个人网站ouz2hou.top,最新文章将第一时间在个人网站发表

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值