1.update为每帧调用一次,不同机器不同,fixupdate默认为0.02秒调用一次(固定时间间隔调用),间隔可以在projectsetting中更改,update方法更加的迅速,适用于获取按键,处理角色移动
2. //由于电脑帧数较高,每次按键响应次数多导致移动速度过快,锁定电脑的帧数
//设置垂直同步vsynccount为0,目的是减少画面撕裂
QualitySettings.vSyncCount = 0;
//设置为10帧 但锁帧会降低画面效果,最好用时间
Application.targetFrameRate = 10;
3.角色与碰撞体产生碰撞时颤抖是因为移动时的代码获取的transform.position,transform组件不会考虑是否在碰撞范围内,每次update时移动到碰撞体内,物理引擎生效,把角色撞出去,此时就要用刚体的移动来取代transform的移动。
Vector2 position = transform.position;
position.x = position.x + speed * horizontal * Time.deltaTime;
position.y = position.y + speed * vertical * Time.deltaTime;//DELTATIME 每帧耗时
rigidbody2D.position = position;
4.角色与碰撞体碰撞时自身反转是因为没有冻结z轴的旋转。
5. 控制移动
6.Tile TileMap
tile也可以添加碰撞体,ruletile为按照一定规则可以自动生成的tile
collider type:none为不碰撞,sprite为碰撞
ruletile设置碰撞体需要打开rule,对每一个小tile分别 设置。
7.添加Rigidbody2D,注意判断是否需要去掉重力。注意从资源拖向hierarchy会将角色生成在中间,hierarchy拖向prefab生成预制件,在设置碰撞体如boxcollider2D盒装碰撞体,检测碰撞。
8.设置碰撞体时的技巧,将盒状碰撞体设置在底部,这样可以从后方穿过,更接近真实。如将树的碰撞体设置在树根,如果出现了从前面上方飘过而不是从后方通过,说明中心点位设置有问题。
设置时现在素材图片中修改sprite(spirite editor),修改中心位置在底部,再在预制件中修改碰撞体范围。
9.触发器:isTrigger 不会阻止移动,但仍然会检查碰撞,并发送碰撞消息用于处理。在使用触发器的游戏对象上添加脚本组件,在其中添加事件void OnTriggerEnter2D(Collider2D other)此方法会在每次碰撞时执行。
10.trigger触发的几种方法
void OnTriggerEnter2D(Collider2D other)
void OnTriggerStay2D(Collider2D other)
void OnTriggerExit2D(Collider2D other)
11.刚体的模式可以定义对象如何在处于静止状态时睡眠以节省处理器时间。即可以设置进入时触发静止时睡眠,或从不睡眠,再处理角色受到伤害时,避免neversleep可以让角色不要一直掉血,静止时不掉血。上述方法为每帧调用,角色会短期迅速掉血,为了解决这种问题,可以让其掉血后短暂处于无敌状态。
12.计时的方法:update每帧调用一次,Time.deltaTime为每一帧所用的时间,比如倒计时五秒,就在update中用5-Time.deTime,指导计时数小于0。
13.平铺功能,如果需要让一个预制件多次重复覆盖较大面积,采用放置多个预制件的方式比较笨拙,可以采用平铺的方式,在预制件中找到DrawMode将其更改为Tiled,并按照提示在sprite中完成对MeshType改为Full Rect的操作。这样在拖拉时将会重复,而缩放需要手动设置数值。
14.2D的遮挡关系实现需要现在sprite editor中更改pivot的位置 并在预制件中其sprite sort point改为pivot。
15.敌人角色的自动移动,有两种方式,获取到transform的position并赋值给rigid body2d的position后一是按照纵向或横向设置临界条件,每fixedupdate中移动一个速度,到临界条件了转向;或使用Time.deltaTime*speed作为每次的移动值放入fixedupdate。
16.对于敌人的碰撞掉血机制不能使用isTrigger,因为角色要与敌人发生碰撞,而刚体也可以有碰撞触发机制,需要使用方法OnCollisionEnter2D
Collision2D碰撞细节类,也有三种模式 enter stay exit 回调函数返回的碰撞细节,用于编写碰撞逻辑。
17.动画组件:创建animation 并保存 如果需要反转则在创建窗口中可以找到按什么方向反转。使用animator管理播放,在animator中layers用于3D动画,parameters由我们的脚本向controller提供信息。动画状态机以图形的方式显示过度模式,混合书允许根据参数来混合多段动画。
将刚刚设置好的参数发送到animatorcontroller
18.扔出飞弹
创建对象是unity不会运行start,而是在下一帧才运行,而使用awake会在创建对象时立即调用。
为角色和人物分别创建图层,并取消飞弹与角色间碰撞。
19.使刚体(碰撞)失效
20.飞弹自己消失 destory(gameobject)
碰撞对象消失destroy(collision.gameobject)
超过一定飞行长度自毁如果没有碰到任何碰撞体
21.摄像机组件Cinemachine实现相机的一些操作如让相机跟着角色,cinemachine为虚拟的摄像机,需要创建一个其对象,用follow功能跟随主角。为了让摄像机不随角色移出地图边界,设置边界为一个多边形刚体包裹地图后添加给cm vcam,并为其设置新的layer并不与其他所有层碰撞,设置方法同飞弹。
22.视觉效果组件:粒子系统说明:一个粒子系统可以模拟并渲染许多称为粒子的小图像或网格以产生视觉效果,系统中的每个粒子代表效果中的单个图形元素。系统共同模拟每个粒子以产生完整效果的印象。
在哪添加特效就在哪对其实例化
23. 用户界面:
三大UI系统:UI工具包、UGUI、NGUI
UGUI:
UI使用一种称为画布canvas的游戏对象来渲染特定于UI的组件,创建canvas后,其Rect Transform组件是transform的一种,但具有额外的ui数据。
画布可以处于以下任一模式:
更改锚点的位置,使缩放窗口时仍保持原相对位置。
血条填充时,需要先有一层覆盖层后用新的一层血条填充,设置时摁住alt再点击左下角即可让其自动覆盖父填充。
像这样
编写专门的UIBAR脚本控制血条:
public class UIHealthBar : MonoBehaviour
{
public static UIHealthBar Instance { get; private set; }//创建公有静态成员属性,获取当前血条本身也就是一个静态的血条实例
public Image mask;//创建ui图形对象mask
float originalSize;//记录遮罩层的初始长度
void Awake()
{
Instance = this;//设置静态实例为当前类对象
}
private void Start()
{
originalSize = mask.rectTransform.rect.width;
}
public void SetValue(float value)
{
//传入血量占比,以显示血条的百分比
mask.rectTransform.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, originalSize*value);
}
}
在玩家控制脚本中的血量更改脚本里将当前血量所占百分比调用setvalue传入,注意类型强制转换为float。
24.物理系统:射线投射
为了解决与npc对话时如果简单使用一个触发器,可能玩家背对npc时触发对话,使用射线投射将射线投射到场景中并检查射线是否与碰撞体相交。
25.音频系统
Audio Source 挂接要发出声音的对象(类似于控制器) ,发出的声音由Audio Listener接收。
音频剪辑AudioClip就是在unity中实际发声的文件。
Audio Source:mute-静音,priority优先级,,volume音频声音大小,
Audio Listener:每个场景只能有一个音频监听器。
loop表示一直播放,可以将audio source设置为3d并设置可以听到的范围,注意main camera距离画布有一定距离,所以需要在虚拟摄像机处添加listener并设置一个负z的子对象用于抵消距离。