Unity百游修炼(7)——《炸弹人》详细制作全流程(包含资源)

最终效果:

unity实例

玩法规则:本游戏中,玩家操控角色在场景中移动,利用炸弹来销毁敌人。但需注意,角色不能与敌人接触,一旦接触,游戏即宣告失败。通过完成一系列步骤,我们将逐步实现这个充满挑战的游戏玩法。

1.下载资源并导入场景和角色

场景资源:RPG/FPS Game Assets for PC/Mobile (Industrial Set v2.0) | 3D 工业场景 | Unity Asset Store

Procedural fire | 火焰与爆炸 | Unity Asset Store

角色资源:Easy Primitive People | 3D 角色 | Unity Asset Store

3D Monster Bomb!! | 3D 角色 | Unity Asset Store

(1)导入资源

        打开 Unity 项目,在菜单栏中选择 “Assets” -> “Import Package” -> “Custom Package”。在弹出的文件浏览器中,分别找到下载好的场景资源包和角色资源包,依次选中并点击 “Open”。

 (2)在Texture中找到Map-v1,双击进入场景资源(我移动了位置)

        资源导入完成后,在项目面板中找到 “Assets” 文件夹,然后在其中找到 “Textures” 文件夹。在 “Textures” 文件夹内,仔细查找名为 “Map - v1” 的文件,这是场景资源的关键部分。

(3)展示场景 

        我们可以在 Unity 编辑器的 Scene 视图中看到导入的场景。场景中包含各种建筑、地形等元素,这些将构成游戏的主要环境。可以通过鼠标右键拖动来旋转视角,鼠标滚轮来缩放视角,以便全面观察场景的布局和细节。

(4)创建摄像机,并按照下面设置参数

        在 Hierarchy 面板中,右键点击空白处,选择 “Create Empty” 创建一个空对象。选中该空对象,在 Inspector 面板中,将其命名为 “MainCamera”。然后,为该对象添加 Camera 组件,点击 Inspector 面板中的 “Add Component” 按钮,在搜索框中输入 “Camera” 并选择添加。

 (5)选择一个角色(我这里选择的时devil)

        找到 “Assets” -> “Easy Primitive People” -> “Prefabs” 文件夹。打开该文件夹,里面包含多个预制体角色。逐个查看这些角色模型,根据游戏风格和个人喜好,

 (6)名字更改为player,添加rigidbody组件

        选中 Hierarchy 面板中的 “devil” 角色对象,在 Inspector 面板中,将其名称修改为 “player”,这样便于在后续开发中识别和管理该对象。接着,为 “player” 对象添加 Rigidbody 组件,点击 Inspector 面板中的 “Add Component” 按钮,在搜索框中输入 “Rigidbody” 并选择添加。

(7)添加角色tag标签 player

        在 Inspector 面板中,找到 “Tag” 属性,点击下拉框,选择 “Add Tag”。在弹出的 Tag Manager 窗口中,点击 “+” 号创建一个新标签,将其命名为 “player”。然后回到 “player” 角色对象的 Inspector 面板,再次点击 “Tag” 下拉框,选择刚创建的 “player” 标签。


2.实现角色的移动

(1)创建脚本文件夹,并创建playercontrol脚本

        在项目面板中,右键点击空白处,选择 “Create” -> “Folder”,将新建的文件夹命名为 “Scripts”。这个文件夹用于专门存放游戏中的脚本文件,方便管理和查找。进入 “Scripts” 文件夹,右键点击空白处,选择 “Create” -> “C# Script”,将新创建的脚本命名为 “playercontrol”。该脚本将用于控制角色的移动行为。

 (2)调整一下player参数,防止移动过程中倒了

        选中 Hierarchy 面板中的 “player” 角色对象,在 Inspector 面板中,查看 Rigidbody 组件的参数。

 

(3)双击脚本,编辑代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playercontrol : MonoBehaviour
{
    private Transform player;
    private float speed=4;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        float xvalue=Input.GetAxisRaw("Horizontal");
        float zvalue = Input.GetAxisRaw("Vertical");
        Vector3 dir= new Vector3(xvalue,0,zvalue) ;

        if(dir!=Vector3.zero)
        {
            player.rotation=Quaternion.LookRotation(dir);
            player.Translate(Vector3.forward*Time.deltaTime*speed);
        }
    }
}

(4)挂载脚本


3.添加判断功能,当炸弹和敌人的距离小于3m时,对敌人进行销毁

(1)放置炸弹,并命名为bomb

        在项目面板中,找到 “Assets” -> “3D Monster Bomb!!” -> “Prefabs” 文件夹(假设炸弹预制体在此路径下)。打开该文件夹,找到炸弹预制体,将其拖动到 Hierarchy 面板中。选中 Hierarchy 面板中的炸弹对象,在 Inspector 面板中,将其名称修改为 “bomb”。这个炸弹对象将在玩家按下 space 空格键时被实例化到场景中。

(2)创建脚本bombcontrol

        在 “Scripts” 文件夹中,右键点击空白处,选择 “Create” -> “C# Script”,将新创建的脚本命名为 “bombcontrol”。该脚本用于控制炸弹的爆炸逻辑以及对敌人的销毁操作。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class bombcontrol : MonoBehaviour
{
    public GameObject bombEffectPre;// 接受爆炸效果
     
    // Start is called before the first frame update
    void Start()
    {
        Invoke("Boom", 2f);

    }

    void Boom()
    {
        GameObject effect = Instantiate(bombEffectPre, transform.position, transform.rotation);
        Destroy(effect,2f);
        GameObject[] enemys = GameObject.FindGameObjectsWithTag("Enemy");
        foreach (GameObject enemy in enemys)
        {
            if (Vector3.Distance(transform.position, enemy.transform.position) < 3f)
            {
                Destroy(enemy);
            }
        }
        Destroy(gameObject);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

(3)挂载脚本


4.添加判断功能,当角色和敌人的距离小于3m时,追踪角色;当角色和敌人的距离小于2m时,角色死亡

(1)添加敌人,修改标签为 Enemy(敌人随便选)

(2)创建脚本Enemycontrol

        在 “Scripts” 文件夹中,右键点击空白处,选择 “Create” -> “C# Script”,将新创建的脚本命名为 “Enemycontrol”。该脚本用于控制敌人的追踪行为以及判断角色是否死亡。

(3)编辑脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemycontrol : MonoBehaviour
{
    private GameObject player;

    // Start is called before the first frame update
    void Start()
    {
        player=GameObject.FindWithTag("player");
    }

    // Update is called once per frame
    void Update()
    {
        float distance=Vector3.Distance(player.transform.position,transform.position);

        if(distance <3f)
        {
            transform.LookAt(player.transform);
            transform.Translate(Vector3.forward*1f*Time.deltaTime);
        }

        if(distance <2f)
        {
            Debug.Log("玩家角色死亡");
            Time.timeScale = 0;
        }
    }
}

(4)挂载脚本


5.按space空格键释放炸弹,并且每2s只能释放一个炸弹

(1)修改playercontrol,增添按键释放炸弹

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class playercontrol : MonoBehaviour
{
    private Transform player;
    private float speed=4;
    private float counttime = 2;
    public GameObject bombs;
    // Start is called before the first frame update
    void Start()
    {
        player = GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        float xvalue=Input.GetAxisRaw("Horizontal");
        float zvalue = Input.GetAxisRaw("Vertical");
        Vector3 dir= new Vector3(xvalue,0,zvalue) ;

        if(dir!=Vector3.zero)
        {
            player.rotation=Quaternion.LookRotation(dir);
            player.Translate(Vector3.forward*Time.deltaTime*speed);
        }

        counttime += Time.deltaTime;
        if (Input.GetKey(KeyCode.Space))
        {
            if (counttime > 2)
            {
                counttime = 0;
                Instantiate(bombs, transform.position, transform.rotation);
            }
        }
    }
}

(2) 挂载脚本,挂载炸弹


6.更新摄像机的位置并跟随角色

(1)创建脚本cameracontrol

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class cameracontrol : MonoBehaviour
{
    private Vector3 offset;
    private Transform player;
    // Start is called before the first frame update
    void Start()
    {
        player = GameObject.FindWithTag("Player").transform;
        offset=transform.position-player.transform.position;
    }

    // Update is called once per frame
    void Update()
    {
        transform.position=offset+player.transform.position;
    }
}

(2)挂载脚本,挂载到camera上


7.结束

        这个游戏还有许多可以拓展的方向,比如增加更多的角色技能、丰富敌人的种类和行为模式、设计不同的游戏关卡等。希望大家以本次教程为起点,继续探索 Unity 游戏开发的无限可能,将自己的创意融入到游戏中,打造出更加精彩、独特的游戏作品。祝愿大家在游戏开发的道路上不断进步,收获满满的乐趣与成就。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值