Unity3D入门-坦克大战
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入门-坦克大战相关推荐
- Unity3d之坦克大战(二)
Unity3d之坦克大战(二) 这只是一个非常非常初级的教程.在 Unity3d之真机测试(上)我们创建了一个初级的坦克,今天继续坦克大战的游戏.下面开始吧: 1. 首先我们要创建一个炮弹.打开3DS ...
- 贴图技术入门——坦克大战地图
前天博客中用C语言写了个没有贴图的打字母小游戏,提及到贴图技术,那么今天的主题就是贴图技术入门级. 今天就以坦克大战地图为例,开启游戏贴图之旅... #define _CRT_SECURE_NO_WA ...
- Unity3D 之 坦克大战(一)
坦克大战学习笔记 1. 工程创建.素材导入: 2. 游戏中预制体的制作(环境预制体和动画预制体) <1> 环境预制体制作: 游戏物体Player; 墙体Wall; 障碍物Obstacle: ...
- Unity3D 3D坦克大战
视频学习来源 移动和旋转 using UnityEngine; using System.Collections; /** Adminer:sun2955* http:www.yinghy.com* ...
- 【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统
对于AI,我的初始想法非常easy,首先他要能动,而且是在地图里面动. 懂得撞墙后转弯,然后懂得射击,其它的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AI ...
- 【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器
从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了.经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了.首先 ...
- Unity3d 坦克大战开发日志1
跟着B站上教程开发坦克大战已经有一段时间了,4天了.在此写下关于学习Unity3d引擎时遇到的问题. 1.在制作坦克大战双人对战时,如何进行分屏. 参考博文 如何分屏 总的来说就是,先建立两台Came ...
- [Unity3D入门]分享一个自制的入门级游戏项目坦克狙击手
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- [Unity3D入门]入门级游戏项目坦克狙击手更新
[Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的" ...
最新文章
- 威宝推出支持四接口的桌面硬盘新品
- C++实现has-a关系的两种方法
- Java文件操作:文件夹中搜索文件
- 【leetcode】Single Number (Medium) ☆
- php 逗号 分割字符串
- Java获取并Kill系统进程
- Item Pipeline
- js自动滚动条在底部
- python enumerate的详解
- 每天CookBook之JavaScript-073
- 【 jvm-sandbox-repeater】环境搭建部署
- 尼古拉特斯拉 名言_尼古拉清洁技术的表面魅力
- Python简介,第2章–字符串和列表
- 64位系统装32位mysql有问题吗_32位系统部署到64位下常见问题及解决
- 比洗牙更好 教你5分钟消灭牙垢
- 用数组输出26个小写字母
- JavaScript常用事件及其区别
- torch.distributed.init_process_group(‘gloo’, init_method=‘file://tmp/somefile’, rank=0, world_size=1
- SpringBoot/SSM 物品租赁系统 摄影器材租赁系统
- TOJ 1717 WOJ