Unity 部分
一、unity hub
下载unity,创建项目
二、项目介绍
1、文件含义
Assets -------------------- 存放资源(场景,脚本,素材)
lib ------------------------ 库
logs ----------------------- 日志
package ----------------- 包
projectsetting -------- 工程相关设置
Temp -------------------- 临时文件夹
2、页面布局
右上角可以改变页面布局
可以在editor里面进行设置
3、创建脚本和场景
project -> assets -> 右键 -> create -> c# script
project -> assets -> 右键 -> create -> scene
三、项目基本操作
1、各窗口作用
project 窗口 :查看项目
场景窗口:可以在场景中创建物件
检视窗口(右边):查看属性
2、视角
平行视角:按照大小等比的投影到平面上面
透视视角:按照透视关系显示
3、坐标
世界坐标:一成不变,唯一确定
局部坐标:其他物件都以世界坐标为基础,确定局部坐标
4、工具栏和快捷键
视角工具:q
移动工具:w
旋转工具:e
缩放工具:r
也可以在transform中通过改变
position、rotation、scale的值来实现上述功能
快速聚焦:f
复制:ctrl + d
一个游戏物体有两个组件
1.renderer 组件:控制渲染的组件
2.collider 组件:控制碰撞的组件(简化模型,用于包裹物件,检测碰撞)
pivot:建模时的原点,中心点,建模时确定,位于模型的中心
center:计算整个组件的中心,可能不在模型内部
步移工具:(在全局坐标下使用)按单位长度移动
(快捷键是 ctrl)
四、正式开发案例
tips:
- 可以创建一个空物体,用来存放各个物件,便于整理
- 可以选中每个物件,在物件各个组件的右上角可以选中 reset 使得各属性恢复到默认值
-
1.材质
通过render组件来控制物体的渲染效果,即外观;
render 组件通过 material组件来控制材质;
材质包含 颜色、贴图、和shader
物件属性组件中的 mesh表示网格
2.游戏引擎作用
底层包含渲染引擎(openGL,dx)--------------------------- 只负责把线和图形画在屏幕上
unity 引擎 -------------------------------------------------------------- 可以用来判断物理相关的逻辑(例如碰撞检测)
3.rigidbody组件
给物体添加刚体组件
可以让物体产生重力等物理性质
4.script组件
让物体动起来
通过c#代码让小球动起来
关联C#步骤:
1.设置 rigidbody 变量
2.获取组件,赋值给变量
3.控制组件(施加一个向右的力)
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start() //开始运行一次
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update() //始终运行
{
rd.AddForce(Vector3.right); //添加向右的力
}
}
上述代码中,rd.addforce(vector3.right)表示在三维向量中向右施加一个力
还可将right 更改为 left up down forward back
也可指定任意方向 --------------- 例如:要向( 1 , 2 , 3 )方向,则指定方法为
rd.Addforce( new Vector3( 1 , 2 , 3) );
5.键盘控制
步骤:
1.监听键盘
2.根据键盘按键来控制运动
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start()
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// rd.AddForce(Vector3.right);
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(x,0,z));
}
}
解释:
之所以 GetAxis(“Horizontal”) 能获得水平方向轴的信息是因为可以系统设置的原因
可以在edit -> projectsetting -> inputmanager -> axes 中查看所有轴的信息
也可以自己添加多个字符
6.控制相机跟随
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class followcrema : MonoBehaviour
{
public Transform playertransform ;
private Vector3 offset; //该处设置偏移量(全局变量)
// Start is called before the first frame update
void Start()
{
offset = playertransform.position - transform.position;//此处的 transform 组件表示的是相机的位置,playertransform表示的是小球的位置
}
// Update is called once per frame
void Update()
{
transform.position = playertransform.position - offset;
}
}
该脚本应添加进 主相机 组件。
7.设置墙体
创建 cube 物体,添加墙的材质
设置墙的旋转角度以及墙的位置
8、预制体(prefab)
提前创建一个模板,用于后续改变每一个实例的样式
也可以通过改变每一个实例的样式,进而应用到所有实例
<–预制体和实例的关系 可以类比于 对象和实例的关系–>
9.控制小球旋转
通过添加脚本使得小球旋转
void Update()
{
transform.Rotate(Vector3.up); //物体绕三维向量的上方旋转,每秒钟旋转60°,施加乐一个向上的力
}
10.吃掉食物并反馈结果
碰撞检测
步骤:
- 碰撞检测,检测二者是否发生碰撞
- 碰撞成功后给予反馈(加分、销毁食物)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start()
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// rd.AddForce(Vector3.right);
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(x,0,z) * 1);
}
private void OnCollisionEnter(Collision collision)
{
Debug.Log("发生碰撞了");
if (collision.gameObject.tag == "food") //此处的 gameobject 也可替换成 collider ,即既可以通过游戏物体来获取标签,也可以通过组件来获取标签
{
Destroy(collision.gameObject);
}
}
}
碰撞检测的状态不仅仅只包含 onCollisionEnter (碰撞发生),同时还包含 onCollisionStay (碰撞进行)、onCollisionExit (结束碰撞)。
使用方式相同。
触发检测
步骤:
- 先在物体的 collider 组件中勾选上 is Trigger 选项,将物体变成一个触发器
- 触发检测,检测二者是否接触
- 接触结束后给予反馈(加分、销毁食物)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class player : MonoBehaviour
{
public Rigidbody rd;
// Start is called before the first frame update
void Start()
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// rd.AddForce(Vector3.right);
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(x,0,z) * 1);
}
//触发检测,如果是与标签为食物的游戏物体相撞的话则销毁该游戏物体
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "food") {
Destroy(other.gameObject);
}
}
}
此处的 OnTriggerEnter 表示进入触发区域,OnTriggerStay 则表示停留在触发区域中,OnTriggerExit 则表示离开触发区域。
拓展:
可以通过名字 或 标签来判断碰撞、触发的是哪一类
物体的名字和标签都可以一样。(标签在物体名字的下方,可以自己添加)
11.创建游戏UI
创建一个文字框
步骤:create -> UI -> text
将游戏场景切换成 2d,即可对文字框进行操作
思路:
显示分数,并且当小球碰到食物后实时更新分数值。
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class player : MonoBehaviour
{
public Rigidbody rd;
public int score = 0;
public Text scoretext;
void Start()
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// rd.AddForce(Vector3.right);
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(x,0,z) * 1);
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "food") {
Destroy(other.gameObject);
score++;
scoretext.text = "分数:" + score;
}
}
}
解释:
-
要调用 UI 相关组件,必须先引入 UnityEngine.UI 库
-
提前设置一个 int 变量,用来实现分数增加
-
实时更新分数,将文本物体拖拽到 player 组件的 textscore 中,通过 “ scoretext.text = “分数:” + score ” 来更改文本框显示的内容;
-
将文本框固定于右上角,点击文本框,切换2d,选中定位图标,按住 alt ,选择右上角。
-
创建 文本UI后能在物件里面发现多了两个游戏物体,一个是 Canvas,表示画布,以后创建 UI 组件即可在该画布里面继续创建;另一个是 EventSystem 则表示发生的事件。
12.结算胜利
思路:当食物吃完,即分数达到时,显示胜利UI
步骤:创建文字UI,显示胜利 -> 消除游戏物体 —> 设置 gameobject 变量,分数文本变量 -> 拖拽将胜利文本赋值给文本变量 -> 当分数足够时,设置物体的显示状态为true
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class player : MonoBehaviour
{
public Rigidbody rd;
public int score = 0;
public Text scoretext;
public GameObject wintext; //定义游戏物体变量,设置胜利文字是否显示
void Start()
{
Debug.Log("游戏开始了");
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update()
{
// rd.AddForce(Vector3.right);
float x = Input.GetAxis("Horizontal");
float z = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(x,0,z) * 1);
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "food")
{
Destroy(other.gameObject);
score++;
scoretext.text = "分数:" + score;
if (score == 9)
{
wintext.SetActive(true); //设置游戏物体状态
}
}
}
}
五、游戏打包
选择 file -> build setting -> 选择平台 -> 添加场景 -> build
六、查询官方文档
选择help中的 manual 或 scripting api
( 两者并没有特别的不同,api 更强调每一个方法的功能,manual 是一个小型的官方文档)
UGUI
一、含义
-
游戏的开始菜单
-
RPG游戏的菜单栏,侧边栏和功能栏 例如:背包系统、人物列表
-
用于控制移动的虚拟杆和攻击按钮
二、开始界面案例
1.基本组件(按钮、画布)
创建 canva画布,在画布中创建button、slider、toggle 等组件
并可以在组件中修改相关属性。
2.可滚动查看的公告
创建 image 组件 -> 将文字内容放在图片组件中 -> 给图片添加 scroll rect 组件 -> 将文字组件拖到 content 中
由此可实现文字拖动功能。
注:
- 同时也可以在 scroll rect 中设置水平方向和垂直方向的滚动。
- 添加 mask 组件可让超出边界的部分隐藏。可在mask组件里面取消勾选 show mask graphic ,使得取消背景图片。
添加 scrollbar组件,来添加滚动条,调整direction的方向,并将该组件绑定到 scroll rect 中的垂直方向。
3.按下按钮实现场景跳转
步骤:
-
创建一个空物体,命名为 GameManager
-
给该组件添加一个新的脚本,命名为GameManager
-
通过vs打开该脚本,创建函数onStartGame
代码如下:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Gamemanager : MonoBehaviour { public void onStartGame(string sceneName) { Application.LoadLevel(sceneName); } }
-
在开始按钮中添加事件,拖拽Gamemanager组件到On click 的前面,在后面选择函数Onstartgame ,并内容改成待跳转的场景。使得当点击该按钮时则跳转到下一个场景。
-
最后还需点击file -> build setting ,将场景添加到里面去,即可
4.实现控制方块旋转
创建 slider 组件,绑定slider与方块的速度。
绑定方法:在slider中设置最大和最小值,添加事件,选择函数changespeed
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class rollcube : MonoBehaviour
{
public float speed = 90;
void Update()
{
transform.Rotate(Vector3.up * Time.deltaTime * speed); //设置速度,并让小球旋转
}
public void ChangeSpeed(float NewSpeed) {
this.speed = NewSpeed; //改变速度
}
}