返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Unity3D实现经典小游戏Pacman
  • 178
分享到

Unity3D实现经典小游戏Pacman

2024-04-02 19:04:59 178人浏览 八月长安
摘要

目录项目概况整体布局地图介绍玩法介绍相关知识版本说明项目源码项目概况 整体布局 地图介绍 除了音效,游戏地图上的元素有: 普通糖豆(玩家通过移动,经过的普通糖豆会被吃掉,

项目概况

整体布局

地图介绍

除了音效,游戏地图上的元素有:

  • 普通糖豆(玩家通过移动,经过的普通糖豆会被吃掉,获得积分) 
  • 特殊糖豆(玩家吃到后,可以让所有敌方停止移动,产生幻影效果)
  • 隔离墙(相当于迷宫的墙,在两堵墙之间的间隙才能移动) 
  • 剩余游戏时间Remain(共设300s,时间一到,游戏结束)
  • 截止到现在花费的游戏时间Now(设在0~300之间)
  • 截止到目前为止的游戏得分Score(越高越好)
  • 敌方人机(分为四种颜色区分,小橙、小粉、小蓝、小红)
  • 我方玩家(小黄,游戏的主体之一)

玩法介绍

玩法(输赢的判断):

尽量在所设时限内吃完所有的糖豆并且未被敌方人机碰到。

如果都吃完了,用时少的更佳;

如果都没吃完,相同时间内得分高者更佳。

吃到特殊糖豆(大糖豆),可以让所有敌方停止移动,产生幻影效果,相当于无敌效果的反作用,使自己在某段时间内不会被攻击,延长了玩家的存活时间,可以通过概率设计更改玩家的存活率。

相关知识

学习的过程中,几个比较重要的知识点就是:预制体、克隆体、精灵渲染器、渲染层级、脚本、碰撞检测、触发检测、AI设计、UI设计、固定物理帧...

版本说明

小虾采用的是Unity一个较新的版本-2021.1.16,这里建议小伙伴们下载和教程相同版本的,不然真的会有可能遇到卡点消耗心情哈。

可以和我一样在Unity Hub里面安装,Hub感觉挺好用的。

项目源码

玩家的移动(PacmanMove.cs)


using UnityEngine;
 
public class PacmanMove : MonoBehaviour
{
    //吃豆人的移动速度
    public float speed = 0.35f;
    //吃豆人下一次移动将要去的目的地
    private Vector2 dest = Vector2.zero;
 
    private void Start()
    {
        //保证吃豆人在游戏刚开始的时候不会动
        dest = transfORM.position;
    }
 
    private void FixedUpdate()
    {
        //插值得到要移动到dest位置的下一次移动坐标
        Vector2 temp = Vector2.MoveTowards(transform.position, dest, speed); //随着帧的每次调用,不断向右移动取中间值
        //通过刚体来设置物体的位置
        GetComponent<Rigidbody2D>().MovePosition(temp);
        //必须先达到上一个dest的位置才可以发出新的目的地设置指令
        if ((Vector2)transform.position == dest)
        {
            if ((Input.GeTKEy(KeyCode.UpArrow) || Input.GetKey(KeyCode.W)) && Valid(Vector2.up))
            {
                dest = (Vector2)transform.position + Vector2.up;
            }
            if ((Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S)) && Valid(Vector2.down))
            {
                dest = (Vector2)transform.position + Vector2.down;
            }
            if ((Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A)) && Valid(Vector2.left))
            {
                dest = (Vector2)transform.position + Vector2.left;
            }
            if ((Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D)) && Valid(Vector2.right))
            {
                dest = (Vector2)transform.position + Vector2.right;
            }
            //获取移动方向
            Vector2 dir = dest - (Vector2)transform.position;
            //把获取到的移动方向设置给动画状态机
            GetComponent<Animator>().SetFloat("DirX", dir.x);
            GetComponent<Animator>().SetFloat("DirY", dir.y);
        }
    }
 
    //检测将要去的位置是否可以到达
    private bool Valid(Vector2 dir)
    {
        //记录下当前位置
        Vector2 pos = transform.position;
        //从将要到达的位置向当前位置发射一条射线,并储存下射线信息
        RaycastHit2D hit = Physics2D.Linecast(pos + dir, pos);
        //返回此射线是否打到了吃豆人自身上的碰撞器
        return (hit.collider == GetComponent<Collider2D>());
    }
}

糖豆设计(Pacdot.cs)


using UnityEngine;
 
public class Pacdot : MonoBehaviour
{
    public bool isSuperPacdot = false;
 
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.name == "Pacman")
        {
            if (isSuperPacdot)
            {
                GameManager.Instance.OnEatPacdot(gameObject);
                GameManager.Instance.OnEatSuperPacdot();
                Destroy(gameObject);
            }
            else
            {
                GameManager.Instance.OnEatPacdot(gameObject);
                Destroy(gameObject);
            }
        }
    }
}

敌方人机的移动(GhostMove) 


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
 
public class GhostMove : MonoBehaviour
{
    public GameObject[] wayPointsGos;
    public float speed = 0.2f;
    private List<Vector3> wayPoints = new List<Vector3>();
    private int index = 0;
    private Vector3 startPos;
 
    private void Start()
    {
        startPos = transform.position + new Vector3(0, 3, 0);
        LoadAPath(wayPointsGos[GameManager.Instance.usingIndex[GetComponent<SpriteRenderer>().sortingOrder - 2]]);
    }
 
    private void FixedUpdate()
    {
        if (transform.position != wayPoints[index])
        {
            Vector2 temp = Vector2.MoveTowards(transform.position, wayPoints[index], speed);
            GetComponent<Rigidbody2D>().MovePosition(temp);
        }
        else
        {
            index++;
            if (index >= wayPoints.Count)
            {
                index = 0;
                LoadAPath(wayPointsGos[Random.Range(0, wayPointsGos.Length)]);
            }
        }
        Vector2 dir = wayPoints[index] - transform.position;
        GetComponent<Animator>().SetFloat("DirX", dir.x);
        GetComponent<Animator>().SetFloat("DirY", dir.y);
    }
 
    private void LoadAPath(GameObject go)
    {
        wayPoints.Clear();
        foreach (Transform t in go.transform)
        {
            wayPoints.Add(t.position);
        }
        wayPoints.Insert(0, startPos);
        wayPoints.Add(startPos);
    }
 
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.name == "Pacman")
        {
            if (GameManager.Instance.isSuperPacman)
            {
                transform.position = startPos - new Vector3(0, 3, 0);
                index = 0;
                GameManager.Instance.score += 500;
            }
            else
            {
                collision.gameObject.SetActive(false);
                GameManager.Instance.gamePanel.SetActive(false);
                Instantiate(GameManager.Instance.gameoverPrefab);
                Invoke("ReStart", 3f);
            }
        }
    }
 
    private void ReStart()
    {
        SceneManager.LoadScene(0);
    }
}

到此这篇关于Unity3D实现经典小游戏Pacman的文章就介绍到这了,更多相关Unity3D Pacman游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Unity3D实现经典小游戏Pacman

本文链接: https://lsjlt.com/news/160060.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Unity3D实现经典小游戏Pacman
    目录项目概况整体布局地图介绍玩法介绍相关知识版本说明项目源码项目概况 整体布局 地图介绍 除了音效,游戏地图上的元素有: 普通糖豆(玩家通过移动,经过的普通糖豆会被吃掉,...
    99+
    2024-04-02
  • Unity3D是怎样实现经典小游戏Pacman
    本篇文章为大家展示了Unity3D是怎样实现经典小游戏Pacman,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。项目概况整体布局地图介绍除了音效,游戏地图上的元素有:普通糖豆(玩家通过移动,经过的普...
    99+
    2023-06-22
  • Python+Tkinter实现经典井字棋小游戏
    目录演示介绍官方文档tkinter.messagebox源码演示 介绍 首先来介绍一下GUI库Tkinter 主要模块: tkinter Main Tkinter module....
    99+
    2024-04-02
  • Python实现四个经典小游戏合集
    目录 一、效果展示1、俄罗斯方块2、扫雷3、五子棋4、贪吃蛇二、代码展示1、俄罗斯方块2、扫雷3、五子棋4、贪吃蛇 一、效果展示 1、俄罗斯方块 这个应该是玩起来最最简单的了… 2...
    99+
    2024-04-02
  • js实现经典扫雷游戏
    本文实例为大家分享了js实现经典扫雷游戏的具体代码,供大家参考,具体内容如下 项目结构 实现效果 思路流程 1、写出基本的布局 2、利用js生成扫雷的table表格 3、利用随...
    99+
    2024-04-02
  • 微信小程序实现经典window扫雷游戏
    前言 打开手机游戏列表发现了一款经典的扫雷游戏,在玩的过程中发现游戏逻辑应该不难,想着是不是能自己写写这个游戏,后来用了1天实现了整体游戏开发,于是有了这篇文章来总结整体的游戏开发思...
    99+
    2024-04-02
  • JavaScript实现经典贪吃蛇游戏
    本文实例为大家分享了JavaScript实现经典贪吃蛇游戏的具体代码,供大家参考,具体内容如下 主要使用单例模式,所有元素动态创建; 1.创建地图 var Map; fu...
    99+
    2024-04-02
  • Pygame实战之经典泡泡龙小游戏
    目录导语​正文一、准备中二、开始敲代码三、效果展示总结导语 Python版的消除类的游戏还是很多的,木木子之前也是推过不少~ 比如:百变的消消乐,还记得嘛?今天就出一个消除类——泡...
    99+
    2024-04-02
  • Python实现四个经典小游戏的示例分析
    本篇文章给大家分享的是有关Python实现四个经典小游戏的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 一、效果展示1、俄罗斯方块这个应该是玩起来最最简单的...
    99+
    2023-06-22
  • 怎么用Python+Tkinter实现经典井字棋小游戏
    这篇文章主要讲解了“怎么用Python+Tkinter实现经典井字棋小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python+Tkinter实现经典井字棋小游戏”吧!演示介绍首...
    99+
    2023-06-29
  • C语言实现扫雷经典游戏
    C语言实现扫雷游戏,供大家参考,具体内容如下 实现扫雷游戏 与三子棋游戏类似,为了便于后期对于代码的阅读、理解与地图大小和地雷的数量变更,先用#define定义一个标识符表示一个常量...
    99+
    2024-04-02
  • Java实现经典游戏复杂迷宫
    目录前言主要设计功能截图代码实现总结前言 人类建造迷宫已有5000年的历史。在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相。迷...
    99+
    2024-04-02
  • Python+Pygame实现经典魂斗罗游戏
    目录一、效果展示二、操作说明三、核心代码今天分享一个经典小游戏魂斗罗的 Python 版实现。 一、效果展示 二、操作说明 A:向左 D:向右 W:跳起 S:趴下 J:射击 P:退...
    99+
    2024-04-02
  • JS+HTML实现经典游戏吃豆人
    目录前言HTML代码JS代码游戏截图前言 很早就知道canvas,当时一直没应用到,最近闲来无事就顺便写写看。吃豆游戏可以说是我们80,90后共同的回忆录,小时候常常在学习机上玩,所...
    99+
    2024-04-02
  • 基于WPF实现经典纸牌游戏
    目录1 纸牌类2 布局3 初始化4 事件点击牌堆拖动牌的去留1 纸牌类 之所以产生这个无聊至极的念头,是因为发现Unicode中竟然有这种字符。。。 这就意味着不用任何资源就可以实...
    99+
    2023-02-27
    WPF实现纸牌游戏 WPF纸牌游戏 WPF游戏
  • HTML+JS实现经典推箱子游戏
    目录1. 效果展示2. 游戏介绍3. 游戏规则4. 源码学习1. 效果展示 2. 游戏介绍 经典的推箱子是一个非常古老游戏,甚至是80,90年代的回忆,目的是在训练你的逻辑思考能...
    99+
    2022-11-13
    JS推箱子游戏 JS推箱子 JS 游戏
  • Java+Swing实现经典五子棋游戏
    目录前言主要需求主要设计功能截图代码实现总结前言 五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,...
    99+
    2024-04-02
  • Java+swing实现经典贪吃蛇游戏
    目录前言主要设计功能截图代码实现总结前言 贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃东西,从而使得蛇变得越来越长...
    99+
    2024-04-02
  • Unity3D实现打砖块游戏
    本文实例为大家分享了Unity3D实现打砖块的具体代码,供大家参考,具体内容如下 基于unity2017 1、 使用Plane创建初始地图 (层级菜单[Hierarcy]-> ...
    99+
    2024-04-02
  • 用Python设计一个经典小游戏
    本文主要介绍如何用Python设计一个经典小游戏:猜大小。 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用、参数传递、函数设计、条件控制和循环等,做个整体的总结和复习。 游戏规则: 初始本金是100...
    99+
    2022-06-04
    经典小游戏 Python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作