当前位置: 首页 > news >正文

【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角2.5D游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、需要导入的素材
  • 二、要实现的步骤

    • 俯视角2D人物移动控制
    • 2.5D风格的实现
    • 使用协程实现相机绕玩家旋转效果
  • 总结


前言

  由于要找工作开始重新拾起学习Unity,在B站看了许多Unity基础视频后开始慢慢想起了之前学Unity的知识,今天就从简单的项目工程入手,讨论如何使用Unity制作“饥荒”风格的俯视角2.5D游戏


提示:以下是本篇文章正文内容,下面案例可供参考

一、需要导入的素材

这是B站教学Up主的链接:GitHub - RedFF0000/Don-t-Starve

如果上不去github,可以到Unity中打开Package Manager下载并导入tiny RPG - Forest,这就是本期要使用的素材,

接着我们用Tilemap来简单制作一张地图:

 

二、要实现的步骤

1.俯视角2D人物移动控制

控制人物移动不是随随便便?首先我们给Player新建一个脚本PlayerController.cs,代码内容如下:

代码如下(示例):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerController : MonoBehaviour
{public float speed;private Rigidbody2D rb2d;private Animator animator;private float inputX;private float inputY;private float stopX;private float stopY;private void Awake(){rb2d = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();}private void Update(){inputX = Input.GetAxisRaw("Horizontal");inputY = Input.GetAxisRaw("Vertical");Vector2 input = (transform.right * inputX + transform.up * inputY).normalized;rb2d.velocity = input * speed;if(input != new Vector2(0,0)){animator.SetBool("isMoving", true);stopX = inputX;stopY = inputY;}else{animator.SetBool("isMoving", false);}animator.SetFloat("InputX", stopX);animator.SetFloat("InputY", stopY);}
}

解释一下代码:通过给rb2d的速度赋值的方法来控制玩家移动,那这个stopX和stopY时什么东西呢?这个就是防止你键盘停止一个方向输入后你得让角色的朝向保持不变,因为我们用的是Animator Blend Tree来制作动画,把 stopX和stopY作为动画参数传入到动画器中,根据这两个参数决定混合哪个动画,当值为1的时候就是只有这个方向的动画。

你看InputX=1,InputY=0时,相当于 stopX=1,stopY=0,人物的动画就会保持向右站立,这就是为什么我们需要记录最后输入的XorY。

同理我们给Walk的动画系统也制作一个Blend Tree

整个Player动画关系如下所示:

 

2.2.5D风格的实现

虽然我没玩过饥荒,但2.5D风格很简单,只需要将场景的2D框取消,把mainCamera的rotation.x设置成-45°,Projection改成透视Perspective,马上就出味道来。

3.使用协程实现相机绕玩家旋转效果 

首先我们要实现相机跟随玩家,传统派就是直接cinemachine,其实我们只需要一个脚本就能实现,创建CameraRotate.cs

代码如下(示例):

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraRotate : MonoBehaviour
{private Transform playerPosition;void Start(){playerPosition = GameObject.FindGameObjectWithTag("Player").transform;}void Update(){transform.position = playerPosition.position;}
}

别忘了给Player添加tag

最后实现通过按下Q和E键让视角旋转

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CameraRotate : MonoBehaviour
{private Transform playerPosition;private bool isRotating;public float rotateTime = 0.2f;void Start(){playerPosition = GameObject.FindGameObjectWithTag("Player").transform;}void Update(){transform.position = playerPosition.position;Rotate();}private void Rotate(){if(Input.GetKeyDown(KeyCode.Q) && !isRotating){StartCoroutine(RotateRoutine(-45, rotateTime));}if (Input.GetKeyDown(KeyCode.E) && !isRotating){StartCoroutine(RotateRoutine(45, rotateTime));}}//为了防止旋转僵硬我们用协程渐变地使视角旋转45°private IEnumerator RotateRoutine(int angle, float timer){float number = 60 * timer;float nextAngle = angle / number;isRotating = true;for (int i = 0; i < number; i++){transform.Rotate(0, 0, nextAngle);yield return new WaitForFixedUpdate();}isRotating = false;}
}

 为了防止旋转视角不对,我们可以给main Camera创建一个父对象CameraParent并把该脚本给它,这样它的旋转也会使子物体跟着旋转。


总结

最后成果如下所示:

相关文章:

  • 【随手笔记】
  • 安宝特案例 | AR如何大幅提升IC封装厂检测效率?
  • 安卓显示驱动
  • Unreal Engine——AI生成高精度的虚拟人物和环境(虚拟世界构建、电影场景生成)(一)
  • 喜报 | 知从科技荣获 “AutoSec 安全之星 - 优秀汽车软件供应链安全方案奖”
  • Linux创建虚拟磁盘并分区格式化
  • 剑灵服务端源码(c#版本+数据库+配套客户端+服务端)
  • 嵌入式学习——数据结构——顺序表
  • 20. 如何在MyBatis中处理多表关联查询?常见的实现方式有哪些?
  • 【代码随想录训练营第42期 Day57打卡 - 图论Part7 - Prim算法
  • 拉取ros2_control_demos存储库
  • 单链表的查找与长度计算
  • Pandas中Series()函数的用法
  • 算力服务器和GPU服务器的区别是什么?
  • Android 测试手册
  • 《剑指offer》分解让复杂问题更简单
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 345-反转字符串中的元音字母
  • httpie使用详解
  • iOS 颜色设置看我就够了
  • JAVA SE 6 GC调优笔记
  • Javascript编码规范
  • Java教程_软件开发基础
  • PHP的类修饰符与访问修饰符
  • Python3爬取英雄联盟英雄皮肤大图
  • Sass Day-01
  • 分布式任务队列Celery
  • 基于游标的分页接口实现
  • 技术:超级实用的电脑小技巧
  • 做一名精致的JavaScripter 01:JavaScript简介
  • d²y/dx²; 偏导数问题 请问f1 f2是什么意思
  • 大数据全解:定义、价值及挑战
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • #162 (Div. 2)
  • (二)Eureka服务搭建,服务注册,服务发现
  • (算法)Game
  • (原)本想说脏话,奈何已放下
  • (转) ns2/nam与nam实现相关的文件
  • (转)【Hibernate总结系列】使用举例
  • (转)EOS中账户、钱包和密钥的关系
  • (转)Sql Server 保留几位小数的两种做法
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .DFS.
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET连接MongoDB数据库实例教程
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20160807][系统设计的三次迭代]
  • [AR Foundation] 人脸检测的流程
  • [C]编译和预处理详解
  • [C++][ProtoBuf][初识ProtoBuf]详细讲解
  • [CISCN2019 华北赛区 Day1 Web2]ikun