1. 敌人AI

改变敌人的移动和生成子弹的时间间隔。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Enemy : MonoBehaviour
{//属性值public float moveSpeed = 3;//移动速度private Vector3 bulletEulerAnles;//定义子弹的需要旋转的欧拉角private float v;private float h;//引用private SpriteRenderer sr;//通过切换图片改变转向public Sprite[] tankSprite;//切换用到的图片第一张0上第二张8右第三张16下第四张24左public GameObject bulletPrefab;//子弹的预制物public GameObject explosionPrefab;//特效预制体//计时器private float timeVal;//设置子弹发射的CD值private float timeValChangeDirection=4;//用来改变方向void Start(){sr = GetComponent<SpriteRenderer>();}void Update(){//攻击的时间间隔if (timeVal >= 3f){Attack();}else{timeVal += Time.deltaTime;}}private void FixedUpdate()//固定物理帧{Move();}/// <summary>/// 坦克的攻击方法/// </summary>private void Attack(){//子弹产生的角度:当前坦克的角度加上子弹应该旋转的角度Instantiate(bulletPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bulletEulerAnles));//实例化子弹timeVal = 0;}/// <summary>/// 坦克的移动方法/// </summary>private void Move(){if (timeValChangeDirection >= 4){int num = Random.Range(0, 8);if (num > 5){v = -1;//敌人向下运动h = 0;}else if (num == 0){v = 1;//敌人向上移动h = 0;}else if (num > 0 && num <= 2){h = -1;//敌人向左移动v = 0;}else if (num > 2 && num <= 4){h = 1;//敌人向右移动v = 0;}timeValChangeDirection = 0;//到达之后就归零}else{timeValChangeDirection += Time.fixedDeltaTime;}transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);//fixedDeltaTime每一帧都是固定的秒数if (v < 0){sr.sprite = tankSprite[2];bulletEulerAnles = new Vector3(0, 0, -180);//子弹向下}else if (v > 0){sr.sprite = tankSprite[0];bulletEulerAnles = new Vector3(0, 0, 0);//子弹向上}//设置移动的优先级if (v != 0){return;//同时按下两个方向键,只能在垂直方向上移动}transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);//点击往右移动返回1点击往左移动返回-1 Space.World以世界坐标轴来移动if (h < 0){sr.sprite = tankSprite[3];bulletEulerAnles = new Vector3(0, 0, 90);//子弹指向左边}else if (h > 0){sr.sprite = tankSprite[1];bulletEulerAnles = new Vector3(0, 0, -90);//子弹指向右边}}/// <summary>/// 坦克的死亡方法/// </summary>public void Die(){//产生爆炸特效Instantiate(explosionPrefab, transform.position, transform.rotation);//坦克的死亡方法Destroy(gameObject);}
}

补充子弹的脚本

 case "Tank":if (!isPlayerBullet){collision.SendMessage("Die");//调用玩家的死亡方法 这样可以避免玩家自己的子弹销毁掉自己Destroy(gameObject);}break;case "Enemy":if (isPlayerBullet){collision.SendMessage("Die");Destroy(gameObject);}break;

2.初始化地图

新建空物体MapCreation,挂载MapCreation脚本

这里是暂时生成了老家和围墙

public class MapCreation : MonoBehaviour
{//用来装饰初始化地图所需物体的数组//0.老家 1.墙 2.障碍 3.出生效果 4.河流 5.草 6.空气墙public GameObject[] item;/// <summary>/// 地图的实例化先于所有物体/// </summary>private void Awake(){//实例化老家CreateItem(item[0],new Vector3(0,-8,0),Quaternion.identity);//用墙把老家围起来CreateItem(item[1],new Vector3(-1, -8, 0),Quaternion.identity);CreateItem(item[1], new Vector3(1, -8, 0), Quaternion.identity);for (int i = -1; i < 2; i++){CreateItem(item[1], new Vector3(i,-7,0),Quaternion.identity);}}/// <summary>/// 生成物体/// </summary>/// <param name="createGameObject"></param>/// <param name="createPosition"></param>/// <param name="createRotation"></param>private void CreateItem(GameObject createGameObject,Vector3 createPosition,Quaternion createRotation){GameObject itemGo = Instantiate(createGameObject,createPosition,createRotation);//实例化itemGo.transform.SetParent(gameObject.transform);//设置为当前的游戏物体即本身的空物体}
}

将现在暂时添加的物体的生成的位置存储起来,后续会接着添加

public class MapCreation : MonoBehaviour
{// 0.老家1.墙2.障碍3.出生效果4.河流5.草6.空气墙public GameObject[] item;//用来装饰初始化地图所需物体的数组//已经有东西的位置列表private List<Vector3> itemPositionList = new List<Vector3>();private void Awake(){//实例化老家CreateItem(item[0], new Vector3(0,-8,0),Quaternion.identity);//用墙把老家围起来CreateItem(item[1], new Vector3(-1, -8, 0),Quaternion.identity);CreateItem(item[1], new Vector3(1, -8, 0), Quaternion.identity);for (int i = -1; i < 2; i++){CreateItem(item[1], new Vector3(i, -7, 0), Quaternion.identity);}}private void CreateItem(GameObject createGameObject,Vector3 createPosition,Quaternion createRotation){GameObject itemGo = Instantiate(createGameObject,createPosition,createRotation);itemGo.transform.SetParent(gameObject.transform);itemPositionList.Add(createPosition);}
}

补充设置预制体的大小,使其不出现缝隙
Barriar与Grass与Heart与AirBarriar与River修改的都是一样的3.2

Wall

随机生成位置的方法和生成外围围墙

/// <summary>/// 产生随机位置的方法/// </summary>private Vector3 CreateRandomPosition(){//不生成X=-10,10的两列,y=-8,8两行的位置,为了确保敌人和玩家可以通过while (true){Vector3 createPosition = new Vector3(Random.Range(-9,10),Random.Range(-7,8),0);//产生了随机位置if (!HasThePosition(createPosition))//为真时返回出去不相同的值{return createPosition;//将得到值返回出去}}}private bool HasThePosition(Vector3 createPos){for (int i = 0; i < itemPositionList.Count; i++){if (createPos==itemPositionList[i]){return true;}}return false;}
//实例化外围墙for (int i = -11; i < 12; i++){CreateItem(item[6],new Vector3(i,9,0),Quaternion.identity);}for (int i = -11; i < 12; i++){CreateItem(item[6], new Vector3(i, -9, 0), Quaternion.identity);}for (int i = -8; i < 9; i++){CreateItem(item[6], new Vector3(-11, i, 0), Quaternion.identity);}for (int i = -8; i < 9; i++){CreateItem(item[6], new Vector3(11, i, 0), Quaternion.identity);}

生成地图其他的游戏物体

实例化地图

//实例化地图for (int i = 0; i < 60; i++){CreateItem(item[1],CreateRandomPosition(),Quaternion.identity);//实例化墙}for (int i = 0; i < 20; i++){CreateItem(item[2], CreateRandomPosition(), Quaternion.identity);//实例化障碍}for (int i = 0; i < 20; i++){CreateItem(item[4], CreateRandomPosition(), Quaternion.identity);//实例化河流}for (int i = 0; i < 20; i++){CreateItem(item[5], CreateRandomPosition(), Quaternion.identity);//实例化草}

实例化玩家和敌人

因为玩家都是在出生特效上生成的,所以这里是实例化出来的特效

//初始化玩家 GameObject go = Instantiate(item[3],new Vector3(-2,-8,0),Quaternion.identity);//实例化出来的特效go.GetComponent<Born>().createPlayer = true;
 //产生敌人CreateItem(item[3],new Vector3(-10,8,0),Quaternion.identity);CreateItem(item[3], new Vector3(0, 8, 0), Quaternion.identity);CreateItem(item[3], new Vector3(10, 8, 0), Quaternion.identity);//之后隔一段时间产生敌人  第一次产生是4秒之后,之后是每隔5秒产生InvokeRepeating("CreateEnemy",4,5);
    /// <summary>/// 产生敌人的方法/// </summary>private void CreateEnemy(){int num = Random.Range(0,3);Vector3 EnemyPos = new Vector3();if (num == 0){EnemyPos = new Vector3(-10, 8, 0);}else if (num == 1){EnemyPos = new Vector3(0, 8, 0);}else if (num==2){EnemyPos = new Vector3(10,8,0);}CreateItem(item[3],EnemyPos,Quaternion.identity);}

这里附上生成地图和玩家敌人的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MapCreation : MonoBehaviour
{//用来装饰初始化地图所需物体的数组//0.老家 1.墙 2.障碍 3.出生效果 4.河流 5.草 6.空气墙public GameObject[] item;//已经有东西的位置列表private List<Vector3> itemPositionList = new List<Vector3>();/// <summary>/// 地图的实例化先于所有物体/// </summary>private void Awake(){//实例化老家CreateItem(item[0],new Vector3(0,-8,0),Quaternion.identity);//用墙把老家围起来CreateItem(item[1],new Vector3(-1, -8, 0),Quaternion.identity);CreateItem(item[1], new Vector3(1, -8, 0), Quaternion.identity);for (int i = -1; i < 2; i++){CreateItem(item[1], new Vector3(i,-7,0),Quaternion.identity);}//实例化外围墙for (int i = -11; i < 12; i++){CreateItem(item[6],new Vector3(i,9,0),Quaternion.identity);}for (int i = -11; i < 12; i++){CreateItem(item[6], new Vector3(i, -9, 0), Quaternion.identity);}for (int i = -8; i < 9; i++){CreateItem(item[6], new Vector3(-11, i, 0), Quaternion.identity);}for (int i = -8; i < 9; i++){CreateItem(item[6], new Vector3(11, i, 0), Quaternion.identity);}//初始化玩家 GameObject go = Instantiate(item[3],new Vector3(-2,-8,0),Quaternion.identity);//实例化出来的特效go.GetComponent<Born>().createPlayer = true;//产生敌人CreateItem(item[3],new Vector3(-10,8,0),Quaternion.identity);CreateItem(item[3], new Vector3(0, 8, 0), Quaternion.identity);CreateItem(item[3], new Vector3(10, 8, 0), Quaternion.identity);//之后隔一段时间产生敌人  第一次产生是4秒之后,之后是每隔5秒产生InvokeRepeating("CreateEnemy",4,5);//实例化地图for (int i = 0; i < 60; i++){CreateItem(item[1],CreateRandomPosition(),Quaternion.identity);//实例化墙}for (int i = 0; i < 20; i++){CreateItem(item[2], CreateRandomPosition(), Quaternion.identity);//实例化障碍}for (int i = 0; i < 20; i++){CreateItem(item[4], CreateRandomPosition(), Quaternion.identity);//实例化河流}for (int i = 0; i < 20; i++){CreateItem(item[5], CreateRandomPosition(), Quaternion.identity);//实例化草}}/// <summary>/// 生成物体/// </summary>/// <param name="createGameObject"></param>/// <param name="createPosition"></param>/// <param name="createRotation"></param>private void CreateItem(GameObject createGameObject,Vector3 createPosition,Quaternion createRotation){GameObject itemGo = Instantiate(createGameObject,createPosition,createRotation);//实例化itemGo.transform.SetParent(gameObject.transform);//设置为当前的游戏物体即本身的空物体itemPositionList.Add(createPosition);//创建出来的所有的东西的位置都存储起来了}/// <summary>/// 产生随机位置的方法/// </summary>private Vector3 CreateRandomPosition(){//不生成X=-10,10的两列,y=-8,8两行的位置,为了确保敌人和玩家可以通过while (true){Vector3 createPosition = new Vector3(Random.Range(-9,10),Random.Range(-7,8),0);//产生了随机位置if (!HasThePosition(createPosition))//为真时返回出去不相同的值{return createPosition;//将得到值返回出去}}}private bool HasThePosition(Vector3 createPos){for (int i = 0; i < itemPositionList.Count; i++){if (createPos==itemPositionList[i]){return true;}}return false;}/// <summary>/// 产生敌人的方法/// </summary>private void CreateEnemy(){int num = Random.Range(0,3);Vector3 EnemyPos = new Vector3();if (num == 0){EnemyPos = new Vector3(-10, 8, 0);}else if (num == 1){EnemyPos = new Vector3(0, 8, 0);}else if (num==2){EnemyPos = new Vector3(10,8,0);}CreateItem(item[3],EnemyPos,Quaternion.identity);}
}

SIKI学习——坦克大战06相关推荐

  1. SIKI学习——坦克大战04

    1.子弹的移动和CD值的设置 01.子弹的移动 新建子弹的脚本 在子弹的脚本中写 transform.Translate(transform.up*moveSpeed*Time.deltaTime, ...

  2. SIKI学习——坦克大战03

    1.控制图片的移动以及转向 新建文件夹Scripts 打开Player脚本编写移动代码 注释:图片的转向可以直接改图片的转向或者通过切换图片来改变朝向,或者通过控制Z轴的旋转来改变朝向. 图片的移动 ...

  3. 韩老师坦克大战2.0版本

    本博文源于对b站视频韩老师(韩顺平)的java学习,本章学习坦克大战2.0版本,用多线程实现,本章内容还是比较多的,先看内容效果 内容效果 开局 被打死(黄色是hero) 打死别人 源码 Bomb.j ...

  4. 小白学习Unity 3D做经典游戏坦克大战日常

    老师 | Trigger 学习者 |小白 出品 | Siki 学院 Hello,小伙伴们.接下来小白跟Trigger老师做一款2D游戏坦克大战.从素材.代码到场景和UI的游戏开发.小白把日常遇到的问题 ...

  5. HTML5制作坦克大战游戏+Canvas绘制基础图形——学习笔记一

    1.离线存储:1)存储到本地,可以离线浏览网页  2)不用cookie(安全性不太高,来回交互的数据量比较大) 2.语音识别 3.图像识别 4.HTML5游戏 5.CSS3的强大之处:动画和各种选择器 ...

  6. JavaScript面向对象实现-坦克大战(附前端全套学习路线)

    [课程简介] 使用javascript+面向对象实现一个坦克大战游戏,让更多的同学能更加深入地理解面向对象思想. [主讲内容] 1. 讲解什么是面向对象,javascript中如何实现面向对象 2. ...

  7. 马士兵坦克大战学习笔记(一)

    java初学者对于马士兵坦克大战的个人学习笔记及代码问题总结(第一阶段), 1.系统自动初始化了Graphics g参数 2.设计原则:高内聚,低耦合: 一个模块中的各元素之间的紧密程度越高,内聚性越 ...

  8. Java练手项目2:基于Java的坦克大战游戏(学习Java必备!!!)

    1.引言 随着社会和时代的进步,来自各个方面的压力让人没精打采,为了分解人们的压力,休养那变得疲顿的头脑和劳累的身心,特设计了坦克大战小游戏,游戏操作非常容易,只要将手指放在键盘上敲击相关的游戏键就可 ...

  9. CocosCreator项目学习系列lt;三gt;BattleCity_90tank坦克大战项目的学习

    CocosCreator项目学习系列<三>坦克大战项目的学习<25/12/2017> 知识点总结: 1.TileMap的使用精髓; 2.Joystick虚拟摇杆的整合单脚本; ...

最新文章

  1. 课题背景 一二三代测序技术
  2. 未来已来:5G将在这88个方面影响我们的工作和生活
  3. 5分钟解析Facebook最新推荐算法
  4. equals变量在前面和后面的区别,equals已知(存在实际值)的变量在前的好处
  5. C++11 - 返回类型后置
  6. SurfaceViewDemo
  7. 针对深度学习的GPU芯片选择
  8. Spring陷阱:代理
  9. 语音输入常见六大误区 你中招几条?
  10. postgres stat 记事
  11. 用OpenStack构建“区域医疗”云平台
  12. C/C++[sort( )]排序
  13. 学习笔记:GoogLeNet
  14. WPS、EXCEL中输入公式F4插入绝对引用无反应的解决方法
  15. ipa安装失败,以及安装办法
  16. 2020年如何运营抖音、快手、视频号3个短视频平台
  17. Sketch设置透明背景
  18. IOS(iphone,ipad,itouch)开发 之 屏幕旋转
  19. 程序员之路:Linux目录处理命令_彭世瑜_新浪博客
  20. 三维点云到人体重建(七)

热门文章

  1. CommandArgument传两个以上参数
  2. 安全帐户管理器初始化失败|lsass.exe 0XC0000022
  3. 三个绘图工具类详解Paint(画笔)Canvas(画布)Path(路径)
  4. 【原创】开源,手中的牌怎么打
  5. 华为OD机试题 - 基站维修工程师(JavaScript)| 机考必刷
  6. 牛客网刷题-概率统计
  7. python文件和变量读写
  8. Android StrictMode
  9. 计算机网络基础小抄,自考计算机网络技术基础小抄.doc
  10. 【linux】linux中fork()详解(实例讲解)|fork的运行机制