物体的各种控制方法
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;public class Componentl : MonoBehaviour
{// Transform transform;GameObject obj;public float floSpeed = 0;public float floRotate = 0;// Start is called before the first frame updatevoid Start(){#region 第一节课// obj = GameObject.Find("Sphere"); // 找到球体//Debug.Log(transform.name); // 名字//Debug.Log(transform.tag); // 标签//Debug.Log(transform.position); // 位置//Debug.Log(transform.rotation); // 角度//Debug.Log(transform.eulerAngles); // 欧拉角//Debug.Log(transform.localEulerAngles); // 局部欧拉角//Debug.Log(transform.localPosition); // 局部位置//Debug.Log(transform.localRotation); // 局部角度//Debug.Log(transform.localScale); // 局部缩放//Debug.Log(transform.parent); // 父物体//Debug.Log(transform.childCount); // 子物体数量//Debug.Log(transform.forward); // 前方//Debug.Log(transform.up); // 上方//Debug.Log(transform.right); // 右边 // 其他常用方法// GameObject.Instantiate(obj, transform.position, transform.rotation); // 复制对象#endregion// 摄像机跟随物体// 控制摄像机Camera.main.transform.SetParent(transform); // 摄像机的transform变成当前物体的transformCamera.main.transform.localPosition = new Vector3(0, 3, -4); // 设置局部位置可以看到物体Camera.main.transform.localEulerAngles = new Vector3(6, 0, 0); // 摄像机稍微往下偏一点}// Update is called once per framevoid Update(){#region 物体移动旋转//transform.Translate(Vector3.right * 0.01f);// 物体移动的第一种方法// transform.position += new Vector3(0, 2, 3); // 新建一个结构体// transform.position += Vector3.up * floSpeed * Time.deltaTime; // Time.deltaTime是每帧运行的时间// 1.在unity怎么调速度 2. 上节课运行了以后物体找不到了// ***********************// 物体移动的第二种方法//transform.Translate(Vector3.up * floSpeed * Time.deltaTime);// 物体旋转// transform.Rotate(Vector3.up * floRotate * Time.deltaTime);// 绕..物体旋转// transform.RotateAround(obj.transform.position, Vector3.up, floRotate * Time.deltaTime);// 盯住看// transform.LookAt(Camera.main.transform);// 其他常用方法// GameObject.Destroy(obj); // 删除游戏对象// Resources.Load(); // 加载游戏资源// Application.Quit(); // 退出游戏//if (Input.GetKey(KeyCode.W)) {// floRotate = 3000;//} else {// floRotate = 0;//} #endregionMove();Look();}// 鼠标控制物体旋转private void Look() {float x = Input.GetAxis("Mouse X") * floRotate * Time.deltaTime;// float y = Input.GetAxis("Mouse Y") * floRotate * Time.deltaTime;transform.Rotate(Vector3.up, x);// transform.Rotate(Vector3.up, y);}// 键盘控制物体平移private void Move() {float x = Input.GetAxis("Horizontal"); // 左右向float z = Input.GetAxis("Vertical"); // 前后向transform.Translate(new Vector3(x, 0, z) * floSpeed * Time.deltaTime);// 世界坐标系移动// cc.Move(new Vector3(x, 0, z) * floSpeed * Time.deltaTime);// cc.isGrounded(); // bool值 判断是否在地面// cc.SimpleMove(new Vector3(x, 0, z) * floSpeed);// 局部坐标系移动// cc.SimpleMove((transform.forward * z + transform.right * x) * floSpeed);}private void FixedUpdate() {}
}
输入系统、角色控制器、碰撞体、刚体、射线
- 输入系统 : InputSystem
- 角色控制器 CharacterController : 不能同时添加刚体组件
Move()
: 需要乘deltaTime
, 不受重力影响, 需要使用isGrounded判断
SimpleMove()
: 不需要乘deltaTime
, 不受重力影响 - 碰撞体
Collider
碰撞检测:两方都有Collider
, 至少一方有Rigidbody
- 刚体
Rigidbody
- 射线
Ray
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Componentl2 : MonoBehaviour
{public float floSpeed = 50;public float floRotate = 180;public GameObject Sphere;// CharacterController cc; // 创建一个容器Rigidbody rb;// Start is called before the first frame updatevoid Start(){// cc = GetComponent<CharacterController>(); // 把对象付给它rb = GetComponent<Rigidbody>();//rb.velocity = new Vector3(); // 物体初速度//rb.AddForce(new Vector3()); // 给物体添加力}// Update is called once per framevoid Update(){#region 第二节课// 键盘控制代码//if (Input.GetKey(KeyCode.Escape)) {// Debug.Log("按住空格");//}//if (Input.GetKeyUp(KeyCode.Space)) {// Debug.Log("抬起空格");// transform.Translate(Vector3.up * 10);//}//if (Input.GetKeyDown(KeyCode.Space)) {// Debug.Log("按下空格");//}// 鼠标控制代码//if (Input.GetMouseButton(0)) {// Debug.Log("按住鼠标左键");//}//if (Input.GetMouseButtonUp(0)) {// Debug.Log("抬起鼠标左键");// transform.Translate(Vector3.up * 10);//}//if (Input.GetMouseButtonDown(0)) {// Debug.Log("按下鼠标左键");//}// 虚拟控制器控制//Debug.Log(Input.GetAxis("Horizontal"));//Debug.Log(Input.GetAxis("Vertical"));//Debug.Log(Input.GetAxisRaw("Horizontal"));//Debug.Log(Input.GetAxisRaw("Vertical"));// 鼠标转动视角//Input.mousePosition();//Input.GetAxis("Mouse X");//Input.GetAxis("Mouse Y");//Debug.Log(""); #endregionlearnRay();}private void learnRay() {if (Input.GetMouseButtonDown(0)) { // 单击鼠标左键// 创建一道射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);// 检测射线// out关键字 会输出一个信息 return只能return一个值,是一个bool值 out返回物体的信息if (Physics.Raycast(ray, out RaycastHit hitInfo)) {Debug.Log(hitInfo.transform.name);Debug.Log(hitInfo.point);//hitInfo.point; // 射线撞击点GameObject shell = Instantiate(Sphere,transform.position,transform.rotation);shell.GetComponent<Rigidbody>().velocity = Vector3.Normalize(hitInfo.point - transform.position) * 20;}}}#region 碰撞检测的方法 碰撞检测的方法 碰撞刚发生//private void OnCollisionEnter(Collision collision) {// // Destroy(collision.transform.gameObject); // Debug.Log("刚碰到");//} 碰撞结束//private void OnCollisionExit(Collision collision) {// Debug.Log("碰完了");//} 碰撞进行时//private void OnCollisionStay(Collision collision) {// Debug.Log(collision.transform.name);//} private void OnTriggerEnter(Collider other) {rb.AddForce(transform.up * 500); // 撞到以后跳一下//Debug.Log("我进来啦");}private void OnTriggerStay(Collider other) {Debug.Log(other.transform.name);}private void OnTriggerExit(Collider other) {Debug.Log("我走啦");}#endregion
}
Unity音视频系统
using System;
using System.Collections;
using System.Collections.Generic;
using Unity.VisualScripting;
using UnityEngine;public class Component3 : MonoBehaviour
{AudioSource ads;AudioClip ac;List<AudioClip> acs = new List<AudioClip>();int j = 0;// Start is called before the first frame updatevoid Start(){ads = GetComponent<AudioSource>(); // 找到组件#region AudioSource常用属性和方法//ads.Play(); // 播放//ads.Pause(); // 暂停//ads.UnPause(); // 继续播放//ads.PlayOneShot(); // 播放一次 配合音效使用//ads.volume = 1.0f; // 音量//ads.playOnAwake = true; // 唤醒时播放//ads.mute = false; // 静音//ads.loop = false; // 循环//ads.isPlaying = false; // 是否播放中//ads.clip; // 声音片段 #endregion// 加载音频资源的方法// ac = Resources.Load<AudioClip>("AudioClips/1");for (int i = 0; i < 3; i ++ ) {ac = Resources.Load<AudioClip>("AudioClips/" + (i + 1));acs.Add(ac);}}// Update is called once per framevoid Update(){changeVolume();playMusic();changeMusic();}private void changeVolume() {if (Input.GetKeyDown(KeyCode.M)) {ads.volume += 0.05f;} else if (Input.GetKeyDown(KeyCode.N)) {ads.volume -= 0.05f;}}private void playMusic() {if (Input.GetKeyDown(KeyCode.B)) {if (ads.isPlaying) {ads.Pause(); // 暂停} else {ads.Pause();}}}private void changeMusic() {if (Input.GetKeyDown (KeyCode.Tab)) {ads.clip = acs[j];ads.Play();if (j < acs.Count - 1) {j ++ ;} else {j = 0;}}}
}
学习动画控制器组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Component4 : MonoBehaviour
{Animator am;// Start is called before the first frame updatevoid Start(){am = GetComponent<Animator>();StartCoroutine(learnConroutine());// 关闭协程//StopCoroutine(learnConroutine()); //StopAllCoroutines();}// Update is called once per framevoid Update(){//if (Input.GetKeyDown(KeyCode.F)) { // am.SetTrigger("pickup"); // 设置触发// //am.SetBool(); // 设置bool值// //am.SetFloat(); // 设置浮点数// //am.SetInteger(); // 设置整数值//}}// Unity中协程的使用,采用的是yield return ,返回值是一个协程器// 协程:介于进程和线程之间的一个定义,简单理解为一段一段的程序IEnumerator learnConroutine() { // 协程器// 技能CDwhile (true) {if (Input.GetKeyDown(KeyCode.F)) {am.SetTrigger("pickup"); // 设置触发yield return new WaitForSeconds(5); } else {yield return null;}...//yield return new WaitForSeconds(5); // 过5秒再执行...//yield return null; // 把程序变成要的之前先执行,下次再执行的话,到要的之后再执行}}}
学习GUI系统
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 旧版GUI命名空间
using TMPro; // 新版GUI命名空间
using UnityEngine.SceneManagement; // 场景管理
using System;public class Component5 : MonoBehaviour
{// 给GUI对象赋值的两种方式:// 第一种方式:getcomponent//Text t;// 第二种方式:public + 外界赋值public Text t;public Image image;public RawImage rawImage;public Button button;public InputField inputField;public Toggle toggle;public Slider slider;public Scrollbar scrollbar;public Dropdown dropdown;//TextMeshPro tmp;// Start is called before the first frame updatevoid Start(){// 文本Text//t.GetComponentInChildren<Text>(); t.text = "好好听课别玩了"; // 更改文本内容//t.font; // 字体// 图片 Image//image.sprite = Resources.Load<Sprite>("") as Sprite; // 更改图片// 原始图片 RawImagerawImage.texture = Resources.Load<Texture>("Images/bg2") as Texture; // 更改背景图片// 按钮 Button// 调用方法的第一种方式:public + Unity中设置// 调用方法的第二种方式:AddListenerbutton.onClick.AddListener(clickButton); // 添加监听 保证没有很多对外接口// 文本输入框 InputField//inputField.text; // 输入的内容// 切换 Toggletoggle.onValueChanged.AddListener(clickToggle); // 改变值的写法//toggle.isOn; // 不改变值// 滑动条 Sliderslider.onValueChanged.AddListener(changeSlider);//slider.value;// 滚动条 Scrollbarscrollbar.onValueChanged.AddListener(changeSlider);//scrollbar.value;// 下拉列表 DropdownInitDropdown();dropdown.onValueChanged.AddListener(changeDropdown);}public void InitDropdown() {dropdown.options.Clear(); // 清除列表Dropdown.OptionData opl = new Dropdown.OptionData();opl.text = "比尔吉沃特";dropdown.options.Add(opl);Dropdown.OptionData op2 = new Dropdown.OptionData();op2.text = "德玛西亚";dropdown.options.Add(op2);}void changeDropdown(int intValue) {switch (intValue) {case 0:Debug.Log("登录比尔吉沃特");break;case 1:Debug.Log("登录德玛西亚");break;default:break;}}void clickButton() {if (inputField.text == "123") {Debug.Log("回答正确");} else {Debug.Log("回答错误");}}void clickToggle(bool isOn) { // 必须带bool参数if (isOn) {Debug.Log("静音");} else {Debug.Log("播放");}}void changeSlider(float floValue) {if (floValue < 0.3) {Debug.Log("血量太低了");} else {Debug.Log("血量健康");}}
}
学习Unity事件系统EventSystem
学习Unity事件系统EventSystem
IPointr ... Handler
// 指针事件接口
I ... DragHandler
// 拖拽事件接口
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; // 事件系统命名空间
using UnityEngine.UI;
using TMPro; // 新版文本命名空间public class Component6 : MonoBehaviour, IPointerClickHandler, IDragHandler, IPointerEnterHandler, IPointerExitHandler {// 新版文本的类名称//TMP_Text;//TMP_InputField;//TMP_Dropdown dropdownpublic void OnDrag(PointerEventData eventData) { // 拖拽//transform.position = Input.mousePosition;transform.position = eventData.position; // 两个都可以实现}public void OnPointerClick(PointerEventData eventData) { // 点击Debug.Log("点击图片");}public void OnPointerEnter(PointerEventData eventData) { // 进入GetComponent<Image>().color = Color.blue;}public void OnPointerExit(PointerEventData eventData) { // 退出GetComponent<Image>().color = Color.white;}
}
控制声音的GUI组件、退出游戏
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class Component7 : MonoBehaviour
{// 控制声音的GUI组件public Toggle toggle;public Slider slider;AudioSource ads;// 退出游戏public Button button;// Start is called before the first frame updatevoid Start(){ads = GetComponent<AudioSource>();toggle.onValueChanged.AddListener(PlayMusic);slider.onValueChanged.AddListener(ChangeVolunme);button.onClick.AddListener(QuitGame);}private void QuitGame() {Application.Quit();}private void ChangeVolunme(float arg0) {ads.volume = arg0;}private void PlayMusic(bool arg0) { if (arg0) {ads.Pause();} else {ads.UnPause();}}
}
学习数据库操作
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient; // MySQL连接命名空间
using System;
using Org.BouncyCastle.Security;public class Component8 : MonoBehaviour
{// 服务器、端口号、数据库、用户名、密码、数据格式...string strConn = "server = localhost; port = 3306; database = dbforcsharp; username = root; password = LiuYue20030214; charset=utf8;";// 创建MySQL连接器MySqlConnection sqlConnection;// Start is called before the first frame updatevoid Start(){// 操作数据库的第一步:try {sqlConnection = new MySqlConnection(strConn);sqlConnection.Open(); // 连接数据库Debug.Log(sqlConnection.State); // 输出状态//1.增 insert//int i1 = InsertData();//Debug.Log(i1);//2.删 delete//int i2 = DeleteData();//Debug.Log(i2);//3.改 update//int i3 = UpdateData();//Debug.Log(i3);// 4. 查selectData();} catch (System.Exception) {throw;} finally {if (sqlConnection.State.ToString() == "Open") {// 操作数据库的最后一步sqlConnection.Close();Debug.Log(sqlConnection.State);}}}/// <summary>/// 查询某一行数据/// </summary>private void selectData() {// 第一步 写SQL语句string strSql = "select * from peo where name = '虚竹';";// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteReader方法 using (MySqlDataReader mysqlDataReader = mySqlCommand.ExecuteReader()) {// 第四步 通过MySQLDataReader读取数据while (mysqlDataReader.Read()) {// 使用GetXXX获取不同的数据Debug.Log(mysqlDataReader.GetString(0));Debug.Log(mysqlDataReader.GetString(1));Debug.Log(mysqlDataReader.GetString(2));}}}}/// <summary>/// 所有的非查询操作都是一样的步骤/// </summary>private int InsertData() {// 第一步 写SQL语句string strSql = "insert into peo (name, age) values ('虚竹', 25);";// using降低内存占用// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteNonQuery方法 执行非查询操作 返回int 当数字不为0 表示第i行发生更改return mySqlCommand.ExecuteNonQuery();}}private int DeleteData() {// 第一步 写SQL语句string strSql = "delete from peo where name = '刘悦';"; // where 其中// using降低内存占用// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteNonQuery方法 执行非查询操作 返回int 当数字不为0 表示第i行发生更改return mySqlCommand.ExecuteNonQuery();}}private int UpdateData() {// 第一步 写SQL语句string strSql = "update peo set name = '张三疯' where name = '张三丰';";// using降低内存占用// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteNonQuery方法 执行非查询操作 返回int 当数字不为0 表示第i行发生更改return mySqlCommand.ExecuteNonQuery();}}
}
实现登录和注册功能
- 登录: 获取输入框内容 -> 连接并打开数据库 -> 查找用户名和密码 -> 关闭数据库
Y -> 对比用户名和密码 -> Y -> 登录成功
Y -> 对比用户名和密码 -> N -> 提示登录失败
N -> 提示登录失败 - 注册: 获取输入框内容 -> 连接并打开数据库 -> 查找用户名和密码
Y -> 关闭数据库 -> 提示用户已存在
N -> 添加用户名和密码 -> 关闭数据库 -> 注册成功
- 分解: 按照顺序分解成一个一个模块, 不一定优
- 连接并打开数据库
- 查找用户名和密码
- 关闭数据库
- 对比用户名和密码
- 添加用户名和密码
- 接口:
- 登录 1234
- 注册 1235
- 对象: GUI:输入框2 按钮2 文本
- 连接数据库:
MySqlConnection, ...command, ...reader
- 字符串: 连接数据库, 用户名2, 密码2(用户输入+数据库)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MySql.Data.MySqlClient;
using TMPro;
using UnityEngine.UI;
using System;
using UnityEngine.SceneManagement;public class Component9 : MonoBehaviour
{// 创建GUI// 新版 待改 -> 已改旧版public InputField inputField1;public InputField inputField2;public Button button1;public Button button2;public Text tip;// 服务器、端口号、数据库、用户名、密码、数据格式...string strConn = "server = localhost; port = 3306; database = dbforcsharp; username = root; password = LiuYue20030214; charset=utf8;";// 创建MySQL连接器MySqlConnection sqlConnection;string username;string password;string usernameDB;string passwordDB;// 事件 监听 执行// Start is called before the first frame updatevoid Start(){button1.onClick.AddListener(Login);button2.onClick.AddListener(Registrations);}public void Login() {username = inputField1.text;password = inputField2.text;//1.连接并打开数据库ConnectDB();//2.查找用户名和密码SelectDB(username);//3.关闭数据库CloseDB();//4.对比用户名和密码CompareDB();}public void Registrations() {username = inputField1.text;password = inputField2.text;//1.连接并打开数据库ConnectDB();//2.查找用户名和密码// 我写的//if (username == usernameDB) {// tip.text = "用户名已存在, 请重新输入";//} else {// int i = InsertDB(username, password);// CloseDB();// tip.text = "创建成功";//}// 老师写的if (SelectDB(username)) {tip.text = "用户名已存在";} else {// 3. 添加用户名和密码if (InsertDB(username, password) == 1) {tip.text = "注册成功";} else {tip.text = "注册失败";}}// 4. 关闭数据库CloseDB();}private void ConnectDB() {try {sqlConnection = new MySqlConnection(strConn);sqlConnection.Open(); // 连接数据库Debug.Log(sqlConnection.State); // 输出状态} catch (Exception) {throw;}}private bool SelectDB(string n) {bool isExist = false;// 第一步 写SQL语句string strSql = "select * from user where username = '" + n + "';";// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteReader方法 using (MySqlDataReader mysqlDataReader = mySqlCommand.ExecuteReader()) {// 第四步 通过MySQLDataReader读取数据while (mysqlDataReader.Read()) {isExist = true;usernameDB = mysqlDataReader.GetString(0);passwordDB = mysqlDataReader.GetString(1);}}}return isExist;}private void CloseDB() {if (sqlConnection.State.ToString() == "Open") {// 操作数据库的最后一步sqlConnection.Close();Debug.Log(sqlConnection.State);}}private void CompareDB() {if (usernameDB == username && passwordDB == password) {// tip.text = "登录成功";SceneManager.LoadScene(1);// SceneManager.LoadScene("Scene1");} else {tip.text = "登录失败";}}private int InsertDB(string u, string p) {// 第一步 写SQL语句string strSql = "insert into user (username, password) values ('" + u + "', '" + p + "');";// using降低内存占用// 第二步 使用MySQLCommand发送语句using (MySqlCommand mySqlCommand = new MySqlCommand(strSql, sqlConnection)) {// 第三步 执行ExecuteNonQuery方法 执行非查询操作 返回int 当数字不为0 表示第i行发生更改return mySqlCommand.ExecuteNonQuery();}}
}