最终效果:
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 游戏开发的无限可能,将自己的创意融入到游戏中,打造出更加精彩、独特的游戏作品。祝愿大家在游戏开发的道路上不断进步,收获满满的乐趣与成就。