Unity3D入门-坦克大战

文章目录

  • Unity3D入门-坦克大战
    • 1.基础
    • 2.功能介绍
    • 3.部分代码
    • 4.展示
    • 5.打包发布
    • 6.未处理问题

1.基础

概念1:预制体PreFab

将一个GameObject制作成一个组件模板,用于批量套用

向场景添加一个预制体时,会创建一个它的实例,可在不同场景或同一场景创建多个预制体的实例,当修改预制体的属性时,这些修改也应用在所有实例上。

概念2:碰撞器Box collider

两个碰撞的物体身上都要有碰撞器组件,其中至少有一个为刚体Rigidbody(最好是运动的一方)

原理:刚体长时间不运动会休眠以提升程序性能,如果选择不运动的为刚体,可能互动无效。

其中2D、3D谨防混用,混用则无效

概念3:组件层级Layer

Camera-Sorting Layer-Order In layer

概念4:音频源Audio Source

属性 说明
Audio Clip 设置被播放的音频文件
Mute 静音播放
Play On Awake 唤醒时播放

脚本结构:

public class XXX:Monobehaviour{ //继承Unity的Monobehaviour部分方法void Start(){ //游戏运行第一帧执行}void Update(){ //游戏每运行一帧执行一次}
}

2.功能介绍

​ 菜单页通过键盘【W】、【S】键控制指针选择单/双人游戏,点击空格键确认选项并开始游戏。玩家有三点生命值,在每次生成后的三秒内带有保护盾,敌方攻击无效。游戏开始后生成三架敌方坦克,此后每隔四秒随机生成敌方坦克,当玩家坦克被击杀三次或最下方巢穴被敌方炸毁后游戏失败,失败后玩家不可控制坦克移动,三秒后跳转回菜单页。游戏页右侧图标和数字显示被玩家击杀的坦克数和玩家剩余生命值。【ESC】退出游戏。


3.部分代码

玩家脚本:

public class Player : MonoBehaviour
{public float moveSpeed=3;private Vector3 bulletEulerAngles;private float timeVal;//设置攻击CDprivate float defendTimeVal=3;private bool isDefended=true;private SpriteRenderer sr;public Sprite[] tankSprite;//依次为上右下左public GameObject bulletPrefab;public GameObject explosionPrefab;public GameObject defendEffectPrefab;//受保护引用public AudioSource moveAudio;//音效组件引用,控制音效播放public AudioClip[] tankAudio;//音效素材,拿到资源,控制渲染器引用public void Awake()//属性等在awake中赋值,一开始就拿到{sr = GetComponent<SpriteRenderer>();}// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//是否处于无敌状态if(isDefended){defendEffectPrefab.SetActive(true);defendTimeVal -= Time.deltaTime;if(defendTimeVal<=0){isDefended = false;defendEffectPrefab.SetActive(false);}}}private void FixedUpdate()//固定物理帧,规定占用时间固定{if(PlayerManager.Instance.isDefeated){return;}Move();if(timeVal>=0.4f){Attack();}else{timeVal += Time.fixedDeltaTime;}}private void Attack(){if(Input.GetKeyDown(KeyCode.Space)){//2D游戏旋转方向与3D相反Instantiate(bulletPrefab,transform.position,Quaternion.Euler(transform.eulerAngles+bulletEulerAngles));//最后一个参数:欧拉角转变成四元数timeVal = 0;}}//坦克移动private void Move(){float h = Input.GetAxisRaw("Horizontal");//h和v值为1或-1transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime,Space.World);//改变转向:1.更换不同图片 2.直接改变图片转向if(h<0){sr.sprite = tankSprite[3];bulletEulerAngles =new  Vector3(0,0,90);}else if(h>0){sr.sprite = tankSprite[1];bulletEulerAngles =new  Vector3(0,0,-90);}if(Mathf.Abs(h)>0.05f){moveAudio.clip = tankAudio[1];if(!moveAudio.isPlaying){moveAudio.Play();}}if(h!=0)//设置优先级,横向优先{return;}float v = Input.GetAxisRaw("Vertical");transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime,Space.World);if(v<0){sr.sprite = tankSprite[2];bulletEulerAngles =new  Vector3(0,0,180);}else if(v>0){sr.sprite = tankSprite[0];bulletEulerAngles =new  Vector3(0,0,0);}if(Mathf.Abs(v)>0.05f){moveAudio.clip = tankAudio[1];if(!moveAudio.isPlaying){moveAudio.Play();}}else{moveAudio.clip = tankAudio[0];if(!moveAudio.isPlaying){moveAudio.Play();}}}public void Die(){if(isDefended){return;}PlayerManager.Instance.isDead = true;//爆炸特效Instantiate(explosionPrefab,transform.position, transform.rotation);//坦克死亡Destroy(gameObject);}}

炸弹脚本

public class Bullet : MonoBehaviour
{public float moveSpeed=10;public bool isPlayerBullet;//不设置默认为falsepublic AudioClip hitAudio;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//Translate的第一个参数是沿着世界坐标移动时最后一个参数可写可不写,默认世界坐标//沿着自身坐标移动时,最后一个参数一定要写transform.Translate(transform.up * moveSpeed * Time.deltaTime, Space.World);}private void OnTriggerEnter2D(Collider2D collision){switch(collision.tag){case "Tank":if(!isPlayerBullet){collision.SendMessage("Die");Destroy(gameObject);}break;case "Heart":collision.SendMessage("Die");Destroy(gameObject);break;case "Enemy":if(isPlayerBullet){collision.SendMessage("Die");Destroy(gameObject);//销毁自身}break;case "Wall":if(isPlayerBullet){PlayAudio();}Destroy(collision.gameObject);Destroy(gameObject);//销毁墙和炮弹本身break;case "Barrier":if(isPlayerBullet){PlayAudio();}Destroy(gameObject);break;default:break;}}public void PlayAudio(){AudioSource.PlayClipAtPoint(hitAudio,transform.position);}
}

4.展示

首页面选择单人/双人游戏


攻击敌人


显示攻击敌人的数量和剩余生命值


游戏失败


5.打包发布

保存并命名场景-find-Build Settings-Build-选择打包到的目录。

踩坑:

UnityError.BuildPlayerWindow+BuildMaethodException:2 errors

解决方法:

选择打包目录时创建一个空文件夹存放。


6.未处理问题

字体显示模糊

Unity3D入门-坦克大战相关推荐

  1. Unity3d之坦克大战(二)

    Unity3d之坦克大战(二) 这只是一个非常非常初级的教程.在 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏.下面开始吧: 1. 首先我们要创建一个炮弹.打开3DS ...

  2. 贴图技术入门——坦克大战地图

    前天博客中用C语言写了个没有贴图的打字母小游戏,提及到贴图技术,那么今天的主题就是贴图技术入门级. 今天就以坦克大战地图为例,开启游戏贴图之旅... #define _CRT_SECURE_NO_WA ...

  3. Unity3D 之 坦克大战(一)

    坦克大战学习笔记 1. 工程创建.素材导入: 2. 游戏中预制体的制作(环境预制体和动画预制体) <1> 环境预制体制作: 游戏物体Player; 墙体Wall; 障碍物Obstacle: ...

  4. Unity3D 3D坦克大战

    视频学习来源 移动和旋转 using UnityEngine; using System.Collections; /** Adminer:sun2955* http:www.yinghy.com* ...

  5. 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

    对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...

  6. 【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器

    从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了.经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了.首先 ...

  7. Unity3d 坦克大战开发日志1

    跟着B站上教程开发坦克大战已经有一段时间了,4天了.在此写下关于学习Unity3d引擎时遇到的问题. 1.在制作坦克大战双人对战时,如何进行分屏. 参考博文 如何分屏 总的来说就是,先建立两台Came ...

  8. [Unity3D入门]分享一个自制的入门级游戏项目坦克狙击手

    [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...

  9. [Unity3D入门]入门级游戏项目坦克狙击手更新

    [Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的" ...

最新文章

  1. 威宝推出支持四接口的桌面硬盘新品
  2. C++实现has-a关系的两种方法
  3. Java文件操作:文件夹中搜索文件
  4. 【leetcode】Single Number (Medium) ☆
  5. php 逗号 分割字符串
  6. Java获取并Kill系统进程
  7. Item Pipeline
  8. js自动滚动条在底部
  9. python enumerate的详解
  10. 每天CookBook之JavaScript-073
  11. 【 jvm-sandbox-repeater】环境搭建部署
  12. 尼古拉特斯拉 名言_尼古拉清洁技术的表面魅力
  13. Python简介,第2章–字符串和列表
  14. 64位系统装32位mysql有问题吗_32位系统部署到64位下常见问题及解决
  15. 比洗牙更好 教你5分钟消灭牙垢
  16. 用数组输出26个小写字母
  17. JavaScript常用事件及其区别
  18. torch.distributed.init_process_group(‘gloo’, init_method=‘file://tmp/somefile’, rank=0, world_size=1
  19. SpringBoot/SSM 物品租赁系统 摄影器材租赁系统
  20. TOJ 1717 WOJ

热门文章

  1. C语言实现彩票35选7
  2. 【观察】加速建筑产业数字化,紫光建筑云“行胜于言”
  3. Missing semicolon
  4. 万万想不到,线程居然被饿死了
  5. ZSTD 解压缩前端处理方案
  6. >>数据管理:引序和目录
  7. Android学习之----利用DownLoadManager实现版本升级
  8. 电话销售还有前途吗 电话销售岗位职责是什么
  9. PCB板时钟电路的电磁兼容设计
  10. signature=6f1ae6ad5c67016da86cc9325f33f066,中国石油自主聚丙烯熔喷专用料开发成功