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

【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并把该脚本给它,这样它的旋转也会使子物体跟着旋转。


总结

最后成果如下所示:


http://www.kler.cn/a/301906.html

相关文章:

  • 网络基础(4)传输层
  • 速盾:cdn 支持 php 吗?
  • 基于PHP技术的校园站的设计与实现
  • Gitcode文件历史记录查看和还原
  • 【全面系统性介绍】虚拟机VM中CentOS 7 安装和网络配置指南
  • maven的optional选项说明以及具体应用
  • 汽车驾校开设无人机培训机构技术分析
  • 第十七章 番外 共现矩阵
  • 经典文献阅读之--Multi S-Graphs(一种高效的实时分布式语义关系协同SLAM)
  • ubuntu20.04/22.04/24.04 docker 容器安装方法
  • RB-SQL:利用检索LLM框架处理大型数据库和复杂多表查询的NL2SQL
  • JAVAWeb-XML-Tomcat(纯小白下载安装调试教程)-HTTP
  • 算法设计(二)
  • 【Java OJ】弦截法求根(循环)
  • 针对网上nbcio-boot代码审计的actuator方法的未授权访问漏洞和ScriptEngine的注入漏洞的补救
  • 基线代理 AI 系统架构
  • 一个以细节见功底的JAVA程序
  • MySQL——数据库的高级操作(二)用户管理(2)创建普通用户
  • 春招审核新策略:Spring Boot系统实现
  • 大型语言模型:通过代码生成、调试和 CI/CD 集成改变软件开发的游戏规则
  • 大数据新视界 --大数据大厂之Flink强势崛起:大数据新视界的璀璨明珠
  • Stable Diffusion绘画 | ControlNet应用-Tile(分块)—tile_resample(分块-重采样)
  • asio中的异步accept分析
  • 如何将 Electron 项目上架 Apple Store
  • 【时时三省】c语言例题----华为机试题<进制转换>
  • Android-10分区存储介绍及百度APP适配实践(1)