昨天花费了一天的事件,各种方面的考虑太多了,各种写代码,还浪费了很多时间。
今天看了一下一些教程,我整个人都
我昨天一天都干了些什么呀!果断关掉unity,新建了一个项目
不过上面真的有很多值得学习的知识点以及插件!!
下面带大家看一看,学习一下!
我是纯靠资源包中的精灵一个一个拖进地图中的,然后Ctrl+D复制,这样费时费力,还容易出现地图脱节的情况!
在Hierarchy中创建2D object中的Tilemap,在右边创建画板Palette,便能在左边的Scene地图中像画画一样创建地图啦!(我建议事先想好建立几个Tilemap,因为有的作为边界是需要碰撞的,而有的作为点缀则不需要碰撞。同时设置好它们的Order In Layer)
创建好Tilemap后,不会直接出现Tile Palette面板,所以怎么打开Palette面板呢?
具体的知识点有点多,而且我自己用的也不是很熟练,给大家一个b站的链接看一下简单操作吧!
链接: https://www.bilibili.com/video/BV1ME411K7wF.
我是利用的两个摄像机,靠自己写的一个摄像机跟随的脚本,利用的Vector3中的插值函数Lerp实现的。类似于童年的游戏松鼠大作战,玩家到达距离右侧屏幕一定距离的时候,屏幕才会向右移动。
public class CameraFollow : MonoBehaviour
{
private Transform transform;
private Transform player;
private void Awake()
{
transform = GetComponent<Transform>();
player = GameObject.FindWithTag("player").transform;
//找到player的transform
}
// Update is called once per frame
void Update()
{
if (player.position.x >= transform.position.x) // 判断摄像机与玩家的位置的x大小
{
transform.position = Vector3.Lerp(new Vector3(transform.position.x, transform.position.y, transform.position.z),
new Vector3(player.position.x, transform.position.y, transform.position.z), 0.3f);
}
}
}
public class AirWallFollow : MonoBehaviour
{
private Transform camera;
private Vector3 OriginDir;
// Start is called before the first frame update
void Start()
{
camera = GameObject.FindWithTag("followcamera").transform;
OriginDir = camera.position - transform.position;
}
// Update is called once per frame
void Update()
{
transform.position = Vector3.Lerp(transform.position, camera.position - OriginDir, 0.5f);
}
}
cinemachine横空出世,只需要调整参数即可完美实现摄像机跟随的效果。我将介绍cinemachine的部分重要参数功能。
当然,一开始我还在想这资源要不要钱什么的!
结果发现,这货现在是unity自带的插件,在package manager里就能下载到。ohhhhh!!!
使用方法明日介绍。
昨天创建UI,想在屏幕左侧加上一个目前有几格血的代码,结果发现这个创建的画布怎么这么大,而且大小也无法更改
于是我做了一个很沙雕的决定:在摄像机能照到的左上角放入了我需要作为血量的几张图片,然后做了一个血量跟随摄像机的代码。
代码与空气墙跟随的代码几乎一样,这里就不赘述了。
但是这样的问题就是会出现,这个血量图片一直在抖动的鬼畜现象!
终于知道了,这个画布是不受我们看到的Scene视图中大小的影响的,无论怎么样都是会显示到我们的屏幕中的。设置这么大是unity自带的,是因为unity不想让我们在设置画布时与地图重合,这样我们可以更好的控制调整画布中每一个UI的位置和大小。所以,我又可以放心大胆的设置UI啦,加入了血量,暂停键,音量键和退出键。
要问unity中最能装b的神器是什么,那还得是动画状态机。
一开始我只设置了几个状态,但后来发现总是会出现向左走转到向右走的过程中会莫名其妙有个idle的动作导致动作的连接不顺畅以及从走的状态转换到跳的状态转换不过去只能原地跳的情况。然后我就各种鼓捣设置,最后就变成了这样:
[真·乱七八糟]
原来我们可以通过一些设置解决这个问题,下面介绍几个关键的属性:
注意:后两种方法必须使用刚体中的transform,否则将出现空引用错误。
nullReferenceException: Object reference not set to an instance of an object
if(hor < 0)
{
GetComponent<SpriteRenderer>().flipX = true;
}
else if(hor > 0)
{
GetComponent<SpriteRenderer>().flipX = false;
}
if (hor != 0)
{
_rigidbody2D.transform.localScale = new Vector3(hor, 1, 1);
}
if(hor < 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0, 180, 0);
}
else if(hor > 0)
{
_rigidbody2D.transform.eulerAngles = new Vector3(0, 0, 0);
}
Update是每帧执行一次,但由于各种机型处理器并不完全相同,帧率也就不同,特别是刚体的运动,会导致在其他机型上的运行并不流畅。而FixedUpdate是固定的时间执行,即每0.02秒执行一次,一秒要执行50次,在所有机型上都是一样的执行速度。因此建议将刚体的运动都写在FixedUpdate函数中。
1. 定义物体上的私有组件名称均使用下划线加组件名。
2.对物体上的物理作用进行操作,要写在FixedUpdate函数中。
3.尽量将代码块分开,面向对象,易于维护。
4.动画状态机中根据需求取消has exit time和fixed duration、Transition Duration。
5.尽量使用虚拟轴和虚拟按键。
6.跳跃可以尝试改变重力的倍数来达到更真实的感觉。gravityscale
7.跳跃的盒子碰撞检测必不可少,利用关键帧的方法是不对的,因为会出现动作无法执行完的情况。
8.调试方法:可以使用debug.log的日志调试或者DrawOnGizmos画图调试.
最后,感谢一下大家的支持!!!虽然不是那么厉害,但看到这个,确实也让我挺受鼓励的!希望这些文章给我帮助的同时也能给正在学习unity的朋友一些帮助,少走一些弯路。