# Unity塔防游戏 **Repository Path**: lai_yingang/moba ## Basic Information - **Project Name**: Unity塔防游戏 - **Description**: unity 塔防游戏 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2022-03-16 - **Last Updated**: 2025-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: Unity, 游戏 ## README ## 塔防游戏 moba public 定义的对象,在unity界面可见,可以直接拖动组件赋值 c#脚本内 使用ui组件需要包含 UI 库, 跳转场景需要包含scenemanagement ```c# using UnityEngine.UI; using UnityEngine.SceneManagement; ``` 点击Main Camera,设置 **清除标志** 为纯色,**背景** 设置成 **白色** ### Canvas 渲染模式: 1. **屏幕空间 覆盖**:canvas将始终覆盖屏幕大小,摄像机视角移动也不会改变 2. 屏幕空间 摄像机 3. 世界空间:canvas将变成一个普通对象,可以移动缩放等等。 ### Canvas Scaler UI 缩放模式 1. 恒定像素大小:屏幕放大,不会放大,会有一定失真 2. **屏幕大小缩放**:随着屏幕放大一起放大 3. 恒定物理大小:固定大小 ### Text 字体大小太大,超过框,就会隐藏 解决办法: 1. 直接修改框的宽高 2. **设置水平溢出和垂直溢出都为 overflow**,无论字体多大都能显示了。 ## 单选组 添加一个 空物体,给他添加 toggle Group 组件,中文叫 开关组 然后切换到 toggle ,在group 属性选择那个新建的组 所有复选框都在一个组内,就是单选,只能选中一个 ## 按钮事件流程 1. 定义按钮 public Button 2. 写按钮点击事件方法 void methodName(){} 3. 在 start() 函数中给按钮添加监听方法 4. 回到unity界面,给定义的按钮赋值,即把按钮组件拖到变量上 ## 场景跳转 1. 包含头文件 ```c# using UnityEngine.SceneManagement; ``` 2. 创建场景 3. 在生成设置(build setting)里面,将**场景添加到 build 中的场景**,直接把场景拖上去 4. 写跳转代码 ```c# SceneManager.LoadScene("场景名称"); ``` ## 数据持久化 PlayerPrefs。setint、setfloat、setString 通过 key value形式存到本地文件中。 ```c# // 存 PlayerPrefs.SetInt("head", 0); // 取 PlayerPrefs.GetInt("head") ``` ## 布局 ### 水平布局 添加组件 **Horizontal Layout Group** 水平布局组 调整子元素间距,和 **padding** ### 垂直和水平(网格布局) 添加组件 **Grid Layout Group** ## 滚动 在滚动的父元素中添加 **scroll rect** 矩形滚动 组件,组件的内容属性即是要滚动的内容。 可选**垂直**或**水平**滚动 ## 遮罩 生成一个固定大小的 元素作为遮罩元素,大小就是你的 **视口**,可见部分。 给该元素添加 **mask** 组件,然后让 要遮罩的内容 成为 遮罩元素 的 **子**元素,即可。 ## 跨类使用方法 实例化对象,调用方法 ```c# public class musicManager : MonoBehaviour { public static musicManager ins; // 实例化对象 // Start is called before the first frame update void Start() { ins = this; // 实例化 } // 播放音效,传入音效数组内的下标 public void playEffectMusic(int index) { } } ``` 在别的类里面使用 ```c# musicManager.ins.playEffectMusic(0); ``` ## 路点设计 一般使用空物体设计,但是空物体场景里面看不见,不方便调整位置,所以使用 平面 plane来充当路点 **不勾上Mesh Renderer** 物体就不会渲染出来 **去掉 Mesh Collider**,使路点没有碰撞盒。 ## 计时 让一个 float计时变量 累加 **Time.deltaTime**,方法放在update里面调用,每个0.02s执行一次,每次就会累加经过的时间,然后在if语句里判断计时变量的值,即是经过多少时间,然后再给 该变量 置0,重新开始。 ## 生成物体方法Instantiate **Instantiate**:要是**预制体**才能生成,创建一个文件夹,将场景中的游戏对象从场景中拖进该文件夹中,即就会变成一个预制体。可以先调整好物体的大小与方向,每次生成预制体就好是你调好的状态。 ```c# Instantiate(对象, 位置, 旋转); ``` ## 批量找到物体 创建 Tag,标签,然后将所有一类的物体都设置同一个标签,然后在代码里面通过标签名找到物体。注意要是多个物体,使用 FindGameObject**s**WithTag 有个 S 的方法,他是按照场景里的顺序找到同标签的物体,返回数组。 ```c# GameObject.FindGameObjectsWithTag("标签名"); ``` ### 当通过FindGameObjectsWithTag来找相关物体,得到的集合顺序是随机的,并不是按照Hierarchy面板中的顺序。当我们需要对其进行排序时,可以借助GetSiblingIndex()来实现。 ``` // 引入需要的头文件 using System.Linq; gameObjectArrays = GameObject.FindGameObjectsWithTag("标签名").OrderBy(g => g.transform.GetSiblingIndex()).ToArray(); ``` ## transform.LookAt(位置) :转向指定位置 ```c# this.transform.LookAt(position); ``` ## Vector3.Distance(A的位置,B的位置):返回浮点型,AB之间的距离, ```c# this.transform.Translate(Vector3.forward * Time.deltaTime * 2); ``` translate移动,forward向前,因为Vector3.forward数字很大所以乘上小数时间,又是倍数,走快一些。 ## Destroy销毁对象 Destroy(this.gameObject); ## Time.timeScale 两个值:0 游戏暂停,1 游戏重新开始 Time.timeScale = 0; ## Quaternion.identity 四元数?表示不旋转?,代表的是 0 0 0? ## transform.Find("名称"); 在当前物体的子物体当中查找指定名字的对象的位置,只能是**二级子物体** ## GameObject.Find("名称") 在场景中查找指定的名称的物体。 ## 使用Slider制作血条 1. canvas设置成世界空间,使之成为普通物体,缩放至合适大小 2. Slider background灰色,fill红色 ## GameObject.activeSelf bool 当前物体活动状态(可见)为真 GameObject.SetActive(false); 设置不可见 ## 按钮上的**interactable**表示是否可点击 ## 更改图片类型 选中图片,在属性面板——纹理类型——将纹理设置成 sprite(2d和ui)——然后弹出对话框,点击应用即可使用。 ### 导入插件 `D:\Program Files\Unity editor\2020.1.4f1c1\Editor\Data\MonoBleedingEdge\lib\mono\2.0-api\System.Data.dll` 拖进来,如果报错,在属性面板,勾上编辑器,然后应用 插件一般放在 `Assets\Plugins` 文件夹下 ## 强制转换成整形:int.Parse() 将字符串数字强制转换成整形 ## 变量跨脚本使用 使用 getComponent得到该对象上挂载的脚本,可以直接使用`.`访问 `public` 的变量 ```c# gameObject.GetComponent().myPos = posIndex; ``` ## build 注意点 ```c# DirectoryNotFoundException: Could not find a part of the path "D:\myunity\moba\build\moba_Data\my_assets\data\tower.xls". ``` 由于使用了读取 `xls`文件来获取数据。打包的时候不会吧`xls`一起打包进去,需要手动将文件拷贝到生成的目录 data中。 ### 构建时在生成设置里面,勾选上`开发构建` 与`脚本调试`运行的时候就能有个 `console`查看信息。 ![1](./2.jpg) ![1](./1.jpg) ## 界面预览 ![1](./Assets/Textures/brief/brief_1.jpg) ```md ![1](./Assets/Textures/brief/brief_1.jpg) ![2](./Assets/Textures/brief/brief_2.jpg) ![3](./Assets/Textures/brief/brief_3.jpg) ![4](./Assets/Textures/brief/brief_4.jpg) ![5](./Assets/Textures/brief/brief_5.jpg) ![6](./Assets/Textures/brief/brief_6.jpg) ![7](./Assets/Textures/brief/brief_7.jpg) ![8](./Assets/Textures/brief/brief_8.jpg) ![9](./Assets/Textures/brief/brief_9.jpg) ![10](./Assets/Textures/brief/brief_10.jpg) ![11](./Assets/Textures/brief/brief_11.jpg) ![12](./Assets/Textures/brief/brief_12.jpg) ```