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


总结

最后成果如下所示:

相关推荐
我的炸串拌饼店8 小时前
火山方舟API C#服务类设计解析
c#·调用火山方舟api
观无10 小时前
visionPro图像预处理
c#
不绝19110 小时前
C#核心:继承
开发语言·c#
Knight_AL11 小时前
用 JOL 验证 synchronized 的锁升级过程(偏向锁 → 轻量级锁 → 重量级锁)
开发语言·jvm·c#
Dr.勿忘12 小时前
MUMU模拟器adb连接失败:cannot connect to 127.0.0.1:16384: 由于目标计算机积极拒绝,无法连接。 (10061)
游戏·unity·adb·游戏程序·调试·模拟器
江沉晚呤时12 小时前
从零实现 C# 插件系统:轻松扩展应用功能
java·开发语言·microsoft·c#
我只有一台windows电脑12 小时前
西门子S7通讯(三)
c#
da_vinci_x13 小时前
武器设计实战:一把大剑裂变 5 种属性?Structure Ref 的“换肤”魔法
游戏·3d·设计模式·ai作画·aigc·设计师·游戏美术
嗷嗷哦润橘_15 小时前
从萝卜纸巾猫到桌游:“蒸蚌大开门”的设计平衡之旅
人工智能·算法·游戏·概率论·桌游
cjp56016 小时前
018.C#管道服务,本机两软件间通讯交互
开发语言·c#