做了个坦克大战的游戏,把主要代码再重新梳理了一下,方便以后温故知新。

Player主代码

public class Player : MonoBehaviour
{//属性值public float moveSpeed = 3;//坦克的移动的速度,当public的时候,就能在unity里面直接调private Vector3 bullectEulerAngles;//射出时,子弹的方向,在坦克移动的时候使用,判断坦克方向的同时就可以顺便把子弹的方向转过来。private float timeVal; //坦克攻击时的计时器,引用在射击间隔public float defendTimeVal=3;//出生时候,被保护的时间private bool isDefended=true;//判断是否被保护,c#里面的bool值默认是false,除非定义的时候就给他赋值//引用private SpriteRenderer sr;//SpriteRenderer就是用来在scene里面渲染出图像,通过Sprite Renderer中的sprite属性选择一个sprite对象显示在视野中。//这里定义一个sr,之后可以直接用sr.来调用这个图像的显示public  Sprite[] tankSprite; //上右下左 创建一个sprite数组,用来存放坦克的朝向不同的图片//用来判断朝向的时候,调用哪一个图片,实现视觉上的转向public GameObject bullectPrefab;//子弹的预设体public GameObject explosionPrefab;//爆炸特效的预设体public GameObject defendEffectPrefab;//保护特效的预设体private void Awake()//脚本加载的时候执行的代码(脚本挂载在场景内的物体这个物体必须是激活的挂在它身上脚本激活或者不激活都会被执行){sr = GetComponent<SpriteRenderer>();//GetComponent是访问游戏对象的组件的方法//比较常规的方式是GetComponent<Rigidbody>().mass = 20;//这样就是可以把rigidbody中的mass属性变成了20;//用sr来替代,sr.sprite = tankSprite[3];就是把sprite变换成为数组3的位置}// Start is called before the first frame updatevoid Start()//在脚本运行的时候运行一次{}private void FixedUpdate()//每秒根据你所定的每一帧的执行时间来计算,你要定义是每帧执行时间为0.02秒,那你用1/0.02那就是每秒执行50次{Move();//调用移动方法}// Update is called once per framevoid Update(){//是否处于无敌状态if (isDefended)//一开始在上面定义的时候是用的true{defendEffectPrefab.SetActive(true);//SetActive是设置GameObject对象的显示和关闭//这里还有一个enable,是用来设置GameObject组件的开启和关闭defendTimeVal -= Time.deltaTime;//Time.deltaTime指完成上一帧所用的时间if (defendTimeVal <= 0){isDefended = false;defendEffectPrefab.SetActive(false);//保护罩就消失了}}//攻击时的CDif (timeVal>=0.5f)//当间隔大于了0.5f时候,就可以执行{Attack();}else{timeVal += Time.deltaTime;//在执行完了Attack之后,会把timeVal重新变成0;}}//坦克移动方法private void Move(){float h = Input.GetAxisRaw("Horizontal");//根据设置(unity一开始设置好了)返回-1,1这种值,当你键盘按下左右的时候,左就是-1,右就是1//使小球按照y轴正方向以每帧1的单位长度移动 transform.Translate(Vector3.up * Time.deltaTime, Space.World);最后的坐标,可以是自身坐标,或者是世界坐标,如果不写就自动是自身坐标transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);if (h < 0){sr.sprite = tankSprite[3];bullectEulerAngles = new Vector3(0, 0, 90);}else if (h > 0){sr.sprite = tankSprite[1];bullectEulerAngles = new Vector3(0, 0, -90);}if (h != 0) //添加优先级{return;}float v = Input.GetAxisRaw("Vertical");//如果是GetAxis的话就是有个加速度,不只是-1,1了transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);if (v < 0){sr.sprite = tankSprite[2];bullectEulerAngles = new Vector3(0, 0, 180);}else if (v > 0){sr.sprite = tankSprite[0];bullectEulerAngles = new Vector3(0, 0, 0);}}//坦克攻击方法private void Attack(){if (Input.GetKeyDown(KeyCode.Space))//如果按下了鼠标空格{//子弹产生的角度应该等于:当前坦克的角度+子弹应该旋转的角度Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles+bullectEulerAngles));//Instantate是用来实例化prefab物体的东西。//参数一:是预设 参数二:实例化预设的坐标  参数三:实例化预设的旋转角度//(GameObject)Instantiate(obj, transform.position, transform.rotation)//这里 transform.position,transform.rotation分别代表的是相机和坐标和旋转角度timeVal = 0;}}//坦克死亡方法private void Die(){//当有保护的时候,跳过之后的方法if (isDefended)//isDefended是一个bool值{return;}//产生爆炸特效Instantiate(explosionPrefab, transform.position, transform.rotation);//这里 transform.position,transform.rotation分别代表的是相机和坐标和旋转角度//死亡Destroy(gameObject);}
}

Born出生

public class Born : MonoBehaviour
{public GameObject playerPrefab;public GameObject[] enemyPrefabList;//新建一个产生敌人的数组public bool createPlayer;//产生一个判断区分是玩家的还是敌人的// Start is called before the first frame updatevoid Start(){Invoke("BornTank", 0.8f);//延时调用这个方法Destroy(gameObject, 0.8f);//摧毁这个特效}// Update is called once per framevoid Update(){}private void BornTank(){if (createPlayer)//判断,是true就产生玩家{Instantiate(playerPrefab, transform.position, Quaternion.identity);}else{int num = Random.Range(0, 2);//0,1随机数,随机产生两种数,分别代表两种敌人Instantiate(enemyPrefabList[num], transform.position, Quaternion.identity);//随机产生了两个数组的数,代表两种敌人}}
}

bullet 子弹

public class bullet : MonoBehaviour
{public float moveSpeed=10;//子弹的速度public bool isPlayerBullect;//判断是不是玩家的子弹,一开始的bool值是false// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){//生成子弹transform.Translate(transform.up  * moveSpeed * Time.deltaTime, Space.World);}private void OnTriggerEnter2D(Collider2D collision)//OnTriggerEnter2D是碰撞器,要产生碰撞,必须双方都有碰撞器,运动的一方要有刚体,至少一方要有trigger{switch (collision.tag){case "Tank":  //碰撞到Tank的标签时if (!isPlayerBullect){collision.SendMessage("Die");Destroy(gameObject);//销毁子弹本身}break;case "Heart":collision.SendMessage("HeartDie");Destroy(gameObject);break;case "Enemy":if(isPlayerBullect)//如果是玩家的子弹{collision.SendMessage("Die");//发送死亡Destroy(gameObject);//销毁子弹本身}break;case "Wall":Destroy(collision.gameObject);//销毁墙Destroy(gameObject);//销毁自身,子弹break;case "Barriar":Destroy(gameObject);//销毁自身break;default:break;}}
}

Home(老家)

public class Heart : MonoBehaviour
{private SpriteRenderer sr;public GameObject explosionPrefab;public Sprite BrokenSprite;// Start is called before the first frame updatevoid Start(){sr = GetComponent<SpriteRenderer>();//得到引用的数组}// Update is called once per framevoid Update(){}public void HeartDie(){sr.sprite = BrokenSprite;//当老家爆炸了之后,就会换一张图片显示Instantiate(explosionPrefab, transform.position, transform.rotation);}
}

实例化地图

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);}//实例化外围空气墙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);//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);InvokeRepeating("CreateEnemy", 4, 5);//1.方法名2.延迟几秒后调用这个方法3.每隔多久调用一次//实例化地图for (int i = 0; i < 90; 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);}}//封装一下,创建的游戏物体不会散落出来private void CreateItem(GameObject createGameObject , Vector3 createPosition,Quaternion createRotation){GameObject itemGO = Instantiate(createGameObject, createPosition, createRotation);itemGO.transform.SetParent(gameObject.transform);itemPositionList.Add(createPosition);//添加到数组里面去}//产生随机位置的方法private Vector3 CreateRandomPosition(){//不生成x=-10,10的两列,y=-8,8的正两行的位置while (true){Vector3 createPosition = new Vector3(Random.Range(-10, 11), Random.Range(-8, 9),0);if (!HasThePosition(createPosition)){return createPosition;}}}//用来判断位置列表中是否有这个位置private bool HasThePosition(Vector3 createPos){for (int i = 0; i < itemPositionList.Count; i++)//列表的长度用count表示{if(createPos == itemPositionList[i]){return true;}}return false;}//产生敌人的方法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{EnemyPos = new Vector3(10, 8, 0);}CreateItem(item[3], EnemyPos, Quaternion.identity);}}

【unity】坦克大战主代码相关推荐

  1. Unity调用大华相机SDK采集图像及基本功能设定

    unity平台对视频播放不是很友好,而大华的SDK只有c#版本的并没有专门为unity做出来SDK,最开始尝试过使用SDK里面的方式获取YUV格式的视频流,再讲YUV格式的视频流转换为unity可以播 ...

  2. unity3d,学习坦克大战后的总结笔记

    在此记录,以防遗忘.在尝试独立制作坦克大战时遇到了一些意想不到的问题,现做一下汇总. 一.Mesh Colider下的Convex选项 Convex的中文意思是凸面体(有道词典).Convex勾选后, ...

  3. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  4. Unity坦克控制行走程序

    实现目标 使用WS键控制坦克前进和后退,AD控制坦克原地旋转 代码详解 分别设置坦克旋转和行进的速度为steer和speed,他们都应该为float类型,我们可以将两个变量公开,以便我们在游戏界面进行 ...

  5. python读文件代码-简单了解Python读取大文件代码实例

    这篇文章主要介绍了简单了解Python读取大文件代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 通常对于大文件读取及处理,不可能直接加载到内 ...

  6. sonar 配置sonarqube分析unity中的C# 代码

    参考文档:使用SonarQube对Unity项目进行代码分析的问题记录 - zerozabuu - 博客园 一文搞定 SonarQube 接入 C#(.NET) 代码质量分析 - 狂师 - 博客园 需 ...

  7. unity团队大作业-足球射门游戏

    unity团队大作业-足球射门游戏 unity团队大作业,足球射门游戏,有分数统计,达到一定分数会变难,适合初学者学习使用,如下动态图所示:(资源链接在文末) 点我下载资源

  8. Unity Shader 常规光照模型代码整理

    Unity Shader 常规光照模型代码整理 本次整理在Unity中几种常见的光照模型,包含 1.BlinnPhong(常规光照模型) 2.ForwardRender(多灯光带有衰弱前向渲染) 3. ...

  9. 给设计师提供的十大无代码网站编辑器

    日期:2013-8-15  来源:GBin1.com 你 是否无时不刻都想拥有自己的网站?但是没有时间去学习编码,你也没有真正的去聘请专业人士.我敢保证有很多人想法跟你一样.如今网络上呈几何基数 倍增 ...

最新文章

  1. pythonsuper_用__init __()方法理解Python super()
  2. 业界真的需要水下数据中心?微软的确认为如此
  3. 企业客户都满意的ToB产品运营秘诀
  4. amh 4.2 升级php_Centos系统 + AMH4.2面板 PHP升级7.3.5
  5. ViewState机制的解析(转自csdn)
  6. 一起讨论系统架构设计师考试大纲中样题参考答案
  7. 低代码从技术走向产品,用友发布自动化设计工具“码前”
  8. 一张图教你如何选择机器学习算法
  9. WinForm中WebBrowser的使用
  10. 使用volatile关键字的场景
  11. [译] 用 Swift 创建自定义的键盘
  12. STM32电机库(ST-MC-Workbench)学习记录——电机参数及传感器设置
  13. 破天服务器的系统,《新破天一剑》束缚系统
  14. 基于FPGA的数字信号处理3.7开平方运算分析
  15. 以太网卡支持的工作模式
  16. html 5 游戏 脚本,HTML 5开发RPG游戏之四(游戏脚本化)(2)
  17. 计算机出现蓝屏cpu很烫,win7系统电脑蓝屏罪魁祸首CPU超频的解决方法
  18. 新版《鹿鼎记》史上最低分!今天用数据分析告诉你韦小宝跟哪个老婆最亲
  19. Win32汇编:数组与标志位测试总结
  20. proteus8 Professional和keil4联调流水灯程序

热门文章

  1. java void(list) 如何改变list的值
  2. 梦想天空(优秀的博主)
  3. docker限制容器的cpu内存使用率
  4. phpcms v9修改flash上传为h5上传方法
  5. 从卡宾男装看服饰现代零售商业升级的方向
  6. 什么是 ChatGPT ?
  7. 工作的意义到底是什么
  8. 学习笔记《科举制与中国文化》
  9. DL380 G6 BIOS刷新方法
  10. 基于UDP协议的中国象棋游戏实现!