2D图片的处理
1.普通图片,要把Texture Type从default改成Sprite(2D and UI)
2.图集(一大张里包含好多张),需要切割使用。切割方法:打开Sprite Editor,点击Slice,选择1:Automatic。一般可以应付绝大多数问题。如果再不行,就选择Grid by cell size。这里有个小技巧,可以先用选择1然后托拉线框测出一个需要的小图片像素大小,然后在利用选择Grid by cell size。
图片大小调整
因为unity的场景是以1m*1m为单位的,为了能看出我们的图片大小,可以选择创建一个cube(大小刚好是基准单位大小)来对比。
另外,当有一大堆2D素材需要调整和第一张图片一样大小时,可以之际ctrl+d复制第一张图,然后点Sprite边上的圆圈,接着把文件夹下的图片换进去。
预制体的制作
新建一个prefabs文件夹,然后直接把场景中的物体拖拽到该文件夹下。
动画
首先新建一个Animations和AnimatorController文件夹,用来存放动画和控制器。
接着,一个小技巧,帧动画:点击第一个图片,然后按住shift再点击最后一个图片,在全选的状态下拖入场景,就会自动生成一个动画文件。
控制角色移动
利用了虚拟按键(horizontal和vertical)+Transform.Translate()函数。
public float speed=3f;
void Update () {
float h = Input.GetAxis("Horizontal");
transform.Translate(Vector3.right*h*speed*Time.deltaTime,Space.World);
float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.up*v*speed*Time.deltaTime,Space.World);
}
解决角色移动不更换图片问题
首先先创建两个变量
private SpriteRenderer sr;
public Sprite[] tankeSprite;
这里要把需要变换的几张图片拖拽到数组里。
然后获得组件
void Awake () {
sr = GetComponent<SpriteRenderer>();
}
接着在Update()里逻辑判断
if (h < 0)
{
sr.sprite = tankeSprite[3];
}
if(h>0)
{
sr.sprite = tankeSprite[1];
}
float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.up*v*speed*Time.deltaTime,Space.World);
if (v < 0)
{
sr.sprite = tankeSprite[2];
}
if (v > 0)
{
sr.sprite = tankeSprite[0];
}
碰撞器添加以及解决物体抖动问题
这里要注意添加的碰撞器和刚体组件都是xxxx2D的。
解决抖动问题的方法:
原理因为物体之间发生了交互,但是因为每一帧的秒数因为计算机的机能问题有所偏差,所以会出现运动的距离不同,所以看起来是抖动的。
解决方法就是放在FixedUpdate()里。Time.deltaTime改成Time.fixeDeltaTime.
解决两个按键同时按下的bug
设立优先级:
if (h > 0)
{
sr.sprite = tankeSprite[1];
}
if (h != 0)
{
return;
}
float v = Input.GetAxis("Vertical");
transform.Translate(Vector3.up * v * speed * Time.fixedDeltaTime, Space.World);
if (v < 0)
在这个位置加一个if(h!=0),如果按键被按下了,那么就返回。
2D渲染层级问题
控制渲染层级的Sort Layer和Order in Layer
这里我们使用Order in Layer,0到5.数字小的先渲染,同时也是会被垫在下层。
攻击的方法实现
//坦克的攻击方法
private void Attack()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
Instantiate(bulletPrefab,transform.position,transform.rotation);
}
}
但是我们发现子弹图片不能转向,且实例化后没有速度
Vector3 bulletEulerAngles;
private void Attack()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//子弹产生的角度:当前坦克的角度+子弹应该旋转的角度
Instantiate(bulletPrefab,transform.position,Quaternion.Euler(transform.eulerAngles+bulletEulerAngles));
}
}
子弹的转向问题已经解决了,接下来解决速度问题。
新建一个脚本
public Transform bullet;
public float speed = 10f;
// Use this for initialization
void Start () {
bullet = GetComponent<Transform>().transform;
}
// Update is called once per frame
void Update () {
bullet.Translate(transform.up * speed * Time.deltaTime, Space.World);
}
这里要注意一定要获取到引用,不然下面调用的时候无效。
攻击CD的设置
新定义一个定时器
//计时器
private void jishiqi()
{
if (timeVal >= 0.4f)
{
Attack();
}
else
{
timeVal += Time