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 update
void 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变成当前物体的transform
Camera.main.transform.localPosition = new Vector3(0, 3, -4); // 设置局部位置可以看到物体
Camera.main.transform.localEulerAngles = new Vector3(6, 0, 0); // 摄像机稍微往下偏一点
}
// Update is called once per frame
void 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;
//}
#endregion
Move();
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() {
}
}
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 update
void Start()
{
// cc = GetComponent(); // 把对象付给它
rb = GetComponent<Rigidbody>();
//rb.velocity = new Vector3(); // 物体初速度
//rb.AddForce(new Vector3()); // 给物体添加力
}
// Update is called once per frame
void 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("");
#endregion
learnRay();
}
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
}
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 update
void 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("AudioClips/1");
for (int i = 0; i < 3; i ++ ) {
ac = Resources.Load<AudioClip>("AudioClips/" + (i + 1));
acs.Add(ac);
}
}
// Update is called once per frame
void 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 update
void Start()
{
am = GetComponent<Animator>();
StartCoroutine(learnConroutine());
// 关闭协程
//StopCoroutine(learnConroutine());
//StopAllCoroutines();
}
// Update is called once per frame
void Update()
{
//if (Input.GetKeyDown(KeyCode.F)) {
// am.SetTrigger("pickup"); // 设置触发
// //am.SetBool(); // 设置bool值
// //am.SetFloat(); // 设置浮点数
// //am.SetInteger(); // 设置整数值
//}
}
// Unity中协程的使用,采用的是yield return ,返回值是一个协程器
// 协程:介于进程和线程之间的一个定义,简单理解为一段一段的程序
IEnumerator learnConroutine() { // 协程器
// 技能CD
while (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; // 把程序变成要的之前先执行,下次再执行的话,到要的之后再执行
}
}
}
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 update
void Start()
{
// 文本Text
//t.GetComponentInChildren();
t.text = "好好听课别玩了"; // 更改文本内容
//t.font; // 字体
// 图片 Image
//image.sprite = Resources.Load("") as Sprite; // 更改图片
// 原始图片 RawImage
rawImage.texture = Resources.Load<Texture>("Images/bg2") as Texture; // 更改背景图片
// 按钮 Button
// 调用方法的第一种方式:public + Unity中设置
// 调用方法的第二种方式:AddListener
button.onClick.AddListener(clickButton); // 添加监听 保证没有很多对外接口
// 文本输入框 InputField
//inputField.text; // 输入的内容
// 切换 Toggle
toggle.onValueChanged.AddListener(clickToggle); // 改变值的写法
//toggle.isOn; // 不改变值
// 滑动条 Slider
slider.onValueChanged.AddListener(changeSlider);
//slider.value;
// 滚动条 Scrollbar
scrollbar.onValueChanged.AddListener(changeSlider);
//scrollbar.value;
// 下拉列表 Dropdown
InitDropdown();
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
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 dropdown
public 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;
}
}
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 update
void 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 update
void 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);
}
}
}
///
/// 查询某一行数据
///
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));
}
}
}
}
///
/// 所有的非查询操作都是一样的步骤
///
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();
}
}
}
MySqlConnection, ...command, ...reader
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 update
void 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();
}
}
}