网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
八方旅人画面演示
下面来看一下在Unity中如何制作一款2.5D的游戏吧!
二、绘制地图
首先我们需要搭建一个地图用于游戏测试,这里使用Unity的 Tile Map Editor
来搭建地图。
Tile Map Editor
的使用方法也很简单,可以看这篇文章学习下怎样使用Tile Map
快速搭建一个地图。
【Unity 实用工具篇】✨| 学会使用 可编程瓦片Tile Map,快速搭建2D地图
层级需要特别注意,这里把 TileMap Renderer
的 Order in Layer
设置为0,这一层用于最下层背景显示,防止遮盖到其他对象。
搭建好的地图如下所示:
此时还需要在地图中增加一些场景物品,如大树、石头等等。
这里在面板中右键 2D Object -> Sprite
创建一个Sprite,然后在Sprite Renderer中设置想要的场景物体精灵图即可,这里要把 Order in Layer
设置为1,否则会看不到新创建的对象。
同时 要给这些添加的场景物品增加碰撞器,让玩家不能穿过该物体。
下面是添加完场景物品后的地图,看起来内容丰富了不少,效果好了很多。
在场景中新建一个游戏对象InteractionObject
,将这些新建的场景物体全部放到InteractionObject对象下当做子物体,方便后期统一处理。
三、添加玩家动画和移动等操作
接下来再创建一个Sprite作为玩家,将 Order in Layer 层级
设置为1,并给玩家添加 Rigidbody2D刚体
和 Collider碰撞体
并适当的调整大小。
接下来在Project下右键 Create -> Animatior Controller
创建一个 Animatior Controller
用来管理玩家的动画,主要有 上、下、左、右移动和默认的Idle动画。
点开Animatior面板后创建两个 BlendTree混合树
。
接下来在Animator面板创建两个 Float类型的参数 InputX 和 InputY 用来在混合树中接收使用。
双击点开Idle混合树,将Blend Type
设置为 2D Simple Doirectional
,这样我们就有两个参数用来表示二维平面上移动。
然后点击混合树面板的 +
添加四个Motion
,分别将Idle的上、下、左、右动画添加上去,并将对应的PosX和PosY数值添加上去。
这里的PosX和PosY代表分别代表玩家按下X轴和Y轴的方向。
例如 PosX为1时代表玩家按下右方向键 此时X轴上的值为1,所以播放Idle_Right动画;
PosY为1时代表玩家按下上方向键 此时Y轴上的值为1,所以播放Idle_Back动画。
动画需要自己找资源配套使用哦!
同样的操作给Walk混合树也配置一下。
然后在Animator面板继续添加一个Bool类型的参数 IsMove
,用来控制玩家的Idle和Walk状态的切换。
这样我们角色的动画就算配置好了,接下来写代码完成角色的移动方法和动画的播放就好了。
如果动画这块还不是很明白的话,也可以再去学习一下Unity中的动画相关知识:
Unity零基础到入门 ☀️| 近万字教程 对 Unity 中的 动画系统基础 全面解析+实战演练。
创建一个脚本PlayerMovement ,将其挂载到玩家身上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed;
new private Rigidbody2D rigidbody;
private Animator animator;
private float inputX, inputY;
private float stopX, stopY;
void Start()
{
rigidbody = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
void Update()
{
inputX = Input.GetAxisRaw("Horizontal");
inputY = Input.GetAxisRaw("Vertical");
//让玩家根据自己本地坐标进行向量计算
Vector2 input = (transform.right \* inputX + transform.up \* inputY).normalized;
rigidbody.velocity = input \* speed;
if (input != Vector2.zero)
{
animator.SetBool("IsMove", true);
stopX = inputX;
stopY = inputY;
}
else
{
animator.SetBool("IsMove", false);
}
animator.SetFloat("InputX", stopX);
animator.SetFloat("InputY", stopY);
}
}
可以选择将Main Camera放到玩家对象当做子物体,这样玩家移动时相机也可以跟着玩家移动,此时运行程序进行测试。
可以看到,此时的游戏画面就是单纯的2D游戏画面,看起来也没有2.5D的既视感,所以还需要对相机进行设置。
四、视角配置
4.1 调整摄像机与场景对象的角度
相机的设置其实很简单,只需要让其视选择45°,以俯视角的视角来观看场景。
先来新建一个游戏对象CameraPosition
,将MainCamera放到该物体下作为子对象,再将MainCamera的Rotation设置为(-45,0,0),Position的数值可以根据搭建的地图进行微调,新建一个脚本RotatingCamera
挂载到该对象上。
该脚本的作用是让相机一直跟随玩家移动,脚本内容如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotatingCamera : MonoBehaviour
{
private Transform player;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
transform.position = player.position;
}
}
再新建一个脚本FacingCamera
,将其挂载到前面搭建的场景对象的父物体InteractionObject
上。
该脚本的作用是让该对象下的所有子物体的角度始终与相机的旋转角度对齐,代码如下:
using UnityEngine;
public class FacingCamera : MonoBehaviour
{
Transform[] childs;
void Start()
{
childs = new Transform[transform.childCount];
for (int i = 0; i < transform.childCount; i++)
{
childs[i] = transform.GetChild(i);
}
}
void Update()
{
for (int i = 0; i < childs.Length; i++)
{
childs[i].rotation = Camera.main.transform.rotation;
}
}
}
此时运行游戏查看效果:
4.2 增加镜头旋转功能
在有些2.5D游戏中还支持镜头的旋转,这里也加上这个功能看一下效果。
首先要修改RotatingCamera的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotatingCamera : MonoBehaviour
{
public float rotateTime = 0.2f;
private Transform player;
private bool isRotating = false;
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update()
{
transform.position = player.position;
Rotate();
}
void Rotate()
{
if (Input.GetKeyDown(KeyCode.Q) && !isRotating)
{
StartCoroutine(RotateAround(-45, rotateTime));
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210511152217670.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poaWd1aWd1,size_16,color_FFFFFF,t_70)
**感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:**
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**