【Unity学习心得】如何使用Unity制作“饥荒”风格的俯视角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,代码内容如下:

代码如下(示例):

c 复制代码
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

代码如下(示例):

c 复制代码
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键让视角旋转

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


总结

最后成果如下所示:

相关推荐
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇26】C#面向对象动态多态——接口(Interface)、接口里氏替换原则、密封方法(`sealed` )
java·开发语言·unity·c#·游戏引擎·里氏替换原则
Java Fans5 小时前
C# 中串口读取问题及解决方案
开发语言·c#
盛派网络小助手5 小时前
微信 SDK 更新 Sample,NCF 文档和模板更新,更多更新日志,欢迎解锁
开发语言·人工智能·后端·架构·c#
码农君莫笑5 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
鲤籽鲲6 小时前
C# Random 随机数 全面解析
android·java·c#
神码编程7 小时前
【Unity功能集】TextureShop纹理工坊(五)选区
unity·游戏引擎·shader·ps选区
fkdw9 小时前
C# Newtonsoft.Json 反序列化派生类数据丢失问题
c#·json
浅尝辄止;12 小时前
C# 异步编程
c#
m0_7482517212 小时前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity