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


总结

最后成果如下所示:

相关推荐
徐子竣2 小时前
[学习记录]Unity-Shader-几何着色器
unity·游戏引擎·着色器
EQ-雪梨蛋花汤7 小时前
【Part 3 Unity VR眼镜端播放器开发与优化】第四节|高分辨率VR全景视频播放性能优化
unity·音视频·vr
TESmart碲视7 小时前
HKS201-M24 大师版 8K60Hz USB 3.0 适用于 2 台 PC 1台显示器 无缝切换 KVM 切换器
单片机·嵌入式硬件·物联网·游戏·计算机外设·电脑·智能硬件
翻滚吧键盘10 小时前
查看linux中steam游戏的兼容性
linux·运维·游戏
江山如画,佳人北望10 小时前
C#程序入门
开发语言·windows·c#
与火星的孩子对话11 小时前
Unity进阶课程【六】Android、ios、Pad 终端设备打包局域网IP调试、USB调试、性能检测、控制台打印日志等、C#
android·unity·ios·c#·ip
future141211 小时前
C#每日学习日记
java·学习·c#
幻世界13 小时前
【Unity智能模型系列】Unity + MediaPipe + Sentis + ArcFace模型:构建高效人脸识别比对系统
unity·游戏引擎
军训猫猫头15 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
m0_5522008215 小时前
《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
c++·游戏·ue5