1. 环境
unity2018
2. 运行截图
3. 功能
1. 场景漫游
提供第一视角模式和自由模式。第一视角使用unity自带的角色控制器包实现角色移动视角移动,自由模式实现鼠标拖拽,场景缩放。
2. 商品定位
通过输入商品信息,在三维场景中定位到商品模型并标识,在模型上方生成2D图形标记。
3. 存取档
通过xml、json、二进制、数据库等方式存储场景内容,本项目连接sqlserver数据库存储读取。
4. 网页(或窗体)交互
提供网页(或窗体)与unity数据传输,将unity页面嵌入浏览器网页或windows客户端(参考前面博客功能)。
4.项目搭建
1. 结构:
设主相机、灯光、plane平面、gameobject(游戏 控制器)、newCube(cube预设体生成位置)、shelves_2xs(场景货架放置位置)、canvas(ui界面)。
2. 实现代码
1)cube预设体
预设体半透明(通过Material材质球设置fade模式,如下图),添加统一标签test(方便后续统一调用),
cube预设体添加脚本moveController控制球体移动旋转,初始关闭moveController组件(后面需要时会在代码中开启)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class moveController : MonoBehaviour
{
public float speed = 3; //人物移动速度
public float rotatinDamping = 4; //人物旋转的速度
public float mouse1RotateDamping = 4;
public bool cameraIsRotate = true; //判断相机是否跟随人物旋转(点击鼠标左键可观看角色)
private float h1; //点击鼠标右键,存储鼠标X方向位移
private float h2; //点击鼠标左键,存储鼠标X方向位移
private float currentOnClickMouse1AngleY = 0; //鼠标右击时人物当前的Y轴度数
private float currentCameraAngleY = 0; //鼠标左击时相机当前的Y轴度数
public GameObject cam; //人物后面的相机
private CharacterController characterContro; //角色控制器组件
// Use this for initialization
private void Start()
{
characterContro = this.GetComponent<CharacterController>();
cam = GameObject.FindGameObjectWithTag("MainCamera");
}
// Update is called once per frame
private void Update()
{
forwardOrBack();
rotate();
mouseControllerRotation();
}
/// <summary>
/// 向前向后移动
/// </summary>
private void forwardOrBack()
{
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
characterContro.Move(transform.forward * speed * Time.deltaTime);
}
else
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
characterContro.Move(-transform.forward * speed * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.Q))
{
characterContro.Move(transform.up * speed * Time.deltaTime);
}
else if (Input.GetKey(KeyCode.E))
{
characterContro.Move(-transform.up * speed * Time.deltaTime);
}
}
/// <summary>
/// 按左右旋转
/// </summary>
private void rotate()
{
if (Input.GetKey(KeyCode.D))
{
transform.Rotate(Vector3.up * rotatinDamping);
}
if (Input.GetKey(KeyCode.A))
{
transform.Rotate(-Vector3.up * rotatinDamping);
}
}
/// <summary>
/// 鼠标控制旋转
/// </summary>
private void mouseControllerRotation()
{
if (Input.GetMouseButtonDown(1))
{
currentOnClickMouse1AngleY = transform.eulerAngles.y;
h1 = 0;
}
if (Input.GetMouseButton(1))
{
h1 += Input.GetAxis("Mouse X") * mouse1RotateDamping;
transform.eulerAngles = new Vector3(transform.eulerAngles.x, h1 + currentOnClickMouse1AngleY, transform.eulerAngles.z);
}
if (Input.GetMouseButtonDown(0))
{
currentCameraAngleY = cam.transform.eulerAngles.y;
h2 = 0;
}
if (Input.GetMouseButton(0))
{
// float currentOnClickMouse1Angle = transform.eulerAngles.y;
cameraIsRotate = false;
h2 += Input.GetAxis("Mouse X") * mouse1RotateDamping;
cam.transform.eulerAngles = new Vector3(cam.transform.eulerAngles.x, h2 + currentCameraAngleY, cam.transform.eulerAngles.z);
}
else
{
cameraIsRotate = true;
}
}
}
2)货架模型shelves_2xs,2D定位预设体
可自行搭建相关货架模型机及定位标记模型
3)主相机main camerra 脚本挂置
cameraController(控制第一人称移动旋转)
CameraMover (控制漫游视角)
ModelDrage(控制物体鼠标点击拖拽)
初始关闭cameraController组件
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class cameraController : MonoBehaviour
{
private moveController mc; //获取人物控制组件
private Transform target; //相机跟随的目标位置
public float rotationDamping = 6; //相机跟随人物的旋转速度
public float zoomSpeed = 4; //鼠标滚轮滑动速度
private float h1; //点击鼠标右键,存储鼠标Y方向位移
private float distance = 0; //相机和目标的距离
//private float height = 1f; //相机和目标的高度
//private float heightDamping = 1;
// Vector3 offsetPosition;
// Use this for initialization
// OnEnable是在Awake之后Start之前执行的,这个函数二次调用时仍会执行,而Start和Awake不会。
// 当然这里有个缺点:第一次执行时,Start函数会执行两遍。之后每次激活这个脚本。便会执行一次Start函数.
// 运行顺序为awake > onenable > start
//此处控制第一视角可以转换目标(如 新建一个cube后直接转到新的cube第一视角)
private void OnEnable()
{
Start();
}
private void Start()
{
// distance = Vector3.Distance(new Vector3(0, 0, target.position.z), new Vector3(0, 0, target.position.z));
//offsetPosition = target.position - transform.position;
int tagLength = GameObject.FindGameObjectsWithTag("test").Length;
target = GameObject.FindGameObjectsWithTag("test")[tagLength - 1].transform;
Debug.Log("start方法" + target.name);
mc = target.gameObject.GetComponent<moveController>();
distance = Vector3.Distance(new Vector3(0, 0, target.position.z), new Vector3(0, 0, transform.position.z));
}
// Update is called once per frame
private void Update()
{
//transform.position = target.position - offsetPosition;
flowTarget();
zoomView();
UpAndDownView();
}
/// <summary>
/// 相机跟随人物移动旋转
/// </summary>
private void flowTarget()
{
float wantedRotationAngle = target.eulerAngles.y; //要达到的旋转角度
//float wantedHeight = target.position.y + height; //要达到的高度
float currentRotationAngle = transform.eulerAngles.y; //当前的旋转角度
float currentHeight = transform.position.y; //当前的高度
if (mc.cameraIsRotate)
{
currentRotationAngle = Mathf.LerpAngle(currentRotationAngle, wantedRotationAngle, rotationDamping * Time.deltaTime);
}
// currentHeight = Mathf.Lerp(currentHeight, wantedHeight, heightDamping * Time.deltaTime); //由当前高度达到要达到的高度
Quaternion currentRotation = Quaternion.Euler(transform.eulerAngles.x, currentRotationAngle, 0);
// float currentRotation=1; //防止主角回头摄像机发生旋转, 这里不用
Vector3 ca = target.position - currentRotation * Vector3.forward * distance; //tt是相机的位置
// transform.position = target.position-currentRotation * Vector3.forward * distance;
// transform.position = new Vector3(ca.x, transform.position.y, ca.z); //最后得到的相机位置
transform.position = new Vector3(ca.x, target.position.y + 2, ca.z);
transform.rotation = currentRotation; //最后得到相机的旋转角度
// transform.LookAt(target.position);
}
/// <summary>
/// 滚轮控制缩放
/// </summary>
private void zoomView()
{
float scrollWheel = Input.GetAxis("Mouse ScrollWheel") * zoomSpeed;
distance -= scrollWheel;
if (distance > 5.6f)
{
distance = 5.6f;
}
if (distance < 0.9f)
{
distance = 0.9f;
}
}
/// <summary>
/// 摄像头上下视角
/// </summary>
private void UpAndDownView()
{
if (Input.GetMouseButton(1))
{
h1 = Input.GetAxis("Mouse Y") * rotationDamping;
Vector3 originalPosition = transform.position;
Quaternion originalRotation = transform.rotation;
transform.RotateAround(target.position, -target.right, h1); //决定因素position和rotation
float x = transform.eulerAngles.x;
if (x < -10 || x > 80)
{
transform.position = originalPosition;
transform.rotation = originalRotation;
}
}
}
}
using UnityEngine;
using System.Collections;
public class CameraMover : MonoBehaviour
{
public float cameraMoveSpeed = 30f;
public float cameraRotSpeed = 30f;
private bool isRotateCamera = false;
private float trans_y = 0;
private float trans_x = 0;
private float trans_z = 0;
private float eulerAngles_x;
private float eulerAngles_y;
// Use this for initialization
private void Start()
{
Vector3 eulerAngles = this.transform.eulerAngles;//当前物体的欧拉角
//Vector3 eulerAngles = new Vector3(20, 0, 0); //当前物体的欧拉角
// Debug.Log(eulerAngles);
this.eulerAngles_x = eulerAngles.y;
this.eulerAngles_y = eulerAngles.x;
}
private void FixedUpdate()
{
if (Input.GetMouseButton(1))
{
this.eulerAngles_x += (Input.GetAxis("Mouse X") * this.cameraRotSpeed) * Time.deltaTime;
this.eulerAngles_y -= (Input.GetAxis("Mouse Y") * this.cameraRotSpeed) * Time.deltaTime;
Quaternion quaternion = Quaternion.Euler(this.eulerAngles_y, this.eulerAngles_x, (float)0);
this.transform.rotation = quaternion;
moveCameraByKey(cameraMoveSpeed);
}
this.trans_z = (Input.GetAxis("Mouse ScrollWheel") * this.cameraMoveSpeed * 30) * Time.deltaTime;
this.transform.Translate(Vector3.forward * this.trans_z);
//if (Input.GetMouseButton(2))
//{
// this.trans_y = (Input.GetAxis("Mouse Y") * this.ySpeed / 2) * 0.02f;
// this.trans_x = (Input.GetAxis("Mouse X") * this.xSpeed / 2) * 0.02f;
// this.transform.Translate(-1 *Vector3.right * this.trans_x);
// this.transform.Translate(-1 *Vector3.up * this.trans_y);
//}
}
private void moveCameraByKey(float speed)
{
if (Input.GetKey(KeyCode.Q))
{
this.transform.Translate(Vector3.down * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.E))
{
this.transform.Translate(Vector3.up * speed * Time.deltaTime);
}
float moveV = Input.GetAxis("Vertical");
float moveH = Input.GetAxis("Horizontal");
this.transform.Translate(Vector3.forward * speed * moveV * Time.deltaTime + Vector3.right * speed * moveH * Time.deltaTime);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ModelDrage : MonoBehaviour
{
private Camera cam;//发射射线的摄像机
private GameObject go;//射线碰撞的物体
public static string btnName;//射线碰撞物体的名字
private Vector3 screenSpace;
private Vector3 offset;
private bool isDrage = false;
private void Start()
{
cam = cam = Camera.main;
// cam = Camera.current;
}
private void Update()
{
//整体初始位置
Ray ray = cam.ScreenPointToRay(Input.mousePosition);
//从摄像机发出到点击坐标的射线
RaycastHit hitInfo;
if (isDrage == false)
{
if (Physics.Raycast(ray, out hitInfo))
{
//划出射线,只有在scene视图中才能看到
Debug.DrawLine(ray.origin, hitInfo.point);
go = hitInfo.collider.gameObject;
//print(btnName);
screenSpace = cam.WorldToScreenPoint(go.transform.position);
offset = go.transform.position - cam.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z));
//物体的名字
btnName = go.name;
//发送给winform
// Application.ExternalEval(btnName);
//组件的名字
}
else
{
btnName = null;
}
}
if (Input.GetMouseButton(0))
{
Vector3 currentScreenSpace = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenSpace.z);
Vector3 currentPosition = cam.ScreenToWorldPoint(currentScreenSpace) + offset;
if (btnName != null)
{
go.transform.position = currentPosition;
}
isDrage = true;
}
else
{
isDrage = false;
}
}
}
4)GameObject脚本挂置
包括新建cube预设体,存读挡,第一人称自由视角变更等操作。
sqlserver,二进制存读挡可以实现,json,xml暂存错误。
(内容较多,暂时把功能代码都放在里面了,后续会分离出来)
using LitJson;
using System.Collections;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Xml;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
[System.Serializable]
public class newCube : MonoBehaviour
{
public Text cubeNo;
private GameObject[] targetGOs;
public GameObject boxBody; //障碍物
public GameObject mark;
private static int i = 1;
private static int a = 0;
private string path;
private bool isActive = true;
private void Awake()
{
}
// Use this for initialization
private void Start()
{
}
// Update is called once per frame
private void Update()
{
int tagLength = GameObject.FindGameObjectsWithTag("test").Length;
if (Input.GetKeyDown(KeyCode.R))
{
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = false;
AppearPosition();
}
if (Input.GetKeyDown(KeyCode.T))
{
//ExportSceneInfoToXML e = new ExportSceneInfoToXML();
//e.ExportXML();
//SaveByBin();
SaveBySql();
}
if (Input.GetKeyDown(KeyCode.Y))
{
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = false;
LoadBySql();
}
if (Input.GetKeyDown(KeyCode.U))
{
for (int i = 0; i < tagLength; i++)
{
GameObject.FindGameObjectsWithTag("test")[i].GetComponent<moveController>().enabled = false;
}
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = false;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraMover>().enabled = true;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<ModelDrage>().enabled = true;
}
if (Input.GetKeyDown(KeyCode.I))
{
GameObject.FindGameObjectsWithTag("test")[tagLength - 1].GetComponent<moveController>().enabled = true;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = true;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraMover>().enabled = false;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<ModelDrage>().enabled = false;
}
}
private void AppearPosition()
{
GameObject newCube = GameObject.Find("newCube");
Vector3 bodyAppearPosition = new Vector3(0, 2, 0);
Quaternion bodyAppearRotation = Quaternion.identity;
// boxBody.transform.parent = newCube.transform;
// Application.ExternalCall(boxBody.name);
// Application.ExternalEval(boxBody.name);
boxBody = Instantiate(boxBody, bodyAppearPosition, bodyAppearRotation);
boxBody.transform.parent = newCube.transform;
boxBody.name = "swj" + i;
i++;
a += 2;
// boxBody.GetComponent<move>().enabled = false;
int tagLength = GameObject.FindGameObjectsWithTag("test").Length;
for (int i = 0; i < tagLength; i++)
{
GameObject.FindGameObjectsWithTag("test")[i].GetComponent<moveController>().enabled = false;
}
GameObject.FindGameObjectsWithTag("test")[tagLength - 1].GetComponent<moveController>().enabled = true;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = true;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<CameraMover>().enabled = false;
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<ModelDrage>().enabled = false;
}
//创建Save对象并存储当前游戏状态信息
private Save CreateSaveGO()
{
targetGOs = GameObject.FindGameObjectsWithTag("test");
Save save = new Save();
foreach (GameObject targetGO in targetGOs)
{
Transform tra = targetGO.transform;
VectorToSave vtf = new VectorToSave();
// vtf.VectorToFloat01(tra);
save.listDouble.Add(vtf.VectorToDouble(tra));
save.cubeNames.Add(tra.name);
// save.list.Add(targetGO);
}
return save;
}
private void SaveByJson()
{
Save save = CreateSaveGO();
path = Application.dataPath + "/test" + "/byJson.json";
//利用JsonMapper将save对象转换为Json格式的字符串
string saveJsonStr = JsonMapper.ToJson(save);
//将这个字符串写入到文件中
//创建一个StreamWriter,并将字符串写入
StreamWriter sw = new StreamWriter(path);
sw.Write(saveJsonStr);
//关闭写入流
sw.Close();
AssetDatabase.Refresh();
// UIManager._instance.ShowMessage("保存成功");
}
private void LoadByJson()
{
// JsonData j;
path = Application.dataPath + "/test" + "/byJson.json";
//创建一个StreamReader,用来读取流
StreamReader sr = new StreamReader(path);
//将读取到的流赋值给saveJsonStr
string saveJsonStr = sr.ReadToEnd();
sr.Close();
//将字符串转换为Save对象
// j = JsonMapper.ToObject<JsonData>(saveJsonStr);
Save save = JsonMapper.ToObject<Save>(saveJsonStr);
SetGame(save);
// UIManager._instance.ShowMessage("加载成功");
}
/// <summary>
/// 二进制存档
/// </summary>
//存档
private void SaveByBin()
{
//序列化过程(将save对象转换为字节流)
//创建save对象并保存当前游戏状态
Save save = CreateSaveGO();
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//创建一个文件流
path = Application.dataPath + "/test" + "/byBin.txt";
FileStream fileStream = File.Create(path);
//用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
bf.Serialize(fileStream, save);
//关闭流
fileStream.Close();
//即时刷新Project工程文件
AssetDatabase.Refresh();
}
// 读档
private void LoadByBin()
{
path = Application.dataPath + "/test" + "/byBin.txt";
//反序列化过程
//创建一个二进制格式化程序
BinaryFormatter bf = new BinaryFormatter();
//打开一个文件流
FileStream fileStream = File.Open(path, FileMode.Open);
//调用格式化程序的反序列化方法,将文件流转换为一个save对象
Save save = bf.Deserialize(fileStream) as Save;
SetGame(save);
//关闭文件流
fileStream.Close();
}
//保存到数据库
private void SaveBySql()
{
//SqlConnection conn = new SqlConnection();
sqlAceess sql = new sqlAceess();
sql.Conn();
//删除数据库旧存档
sql.delete();
// sql.Insert(conn);
Save save = new Save();
targetGOs = GameObject.FindGameObjectsWithTag("test");
foreach (GameObject targetGO in targetGOs)
{
Transform tra = targetGO.transform;
save.x = tra.position.x;
save.y = tra.position.y;
save.z = tra.position.z;
save.l = tra.rotation.x;
save.m = tra.rotation.y;
save.n = tra.rotation.z;
save.w = tra.rotation.w;
save.cubeName = tra.name;
//插入到数据库
sql.Insert(save);
}
sql.ConnClose();
}
//从数据库读取
private void LoadBySql()
{
//读取存档前 删除目前正在运行的cube
targetGOs = GameObject.FindGameObjectsWithTag("test");
foreach (GameObject targetGO in targetGOs)
{
Destroy(targetGO);
}
sqlAceess sql = new sqlAceess();
sql.Conn();
List<Save> listSave = sql.select();
for (int i = 0; i < listSave.Count; i++)
{
Save sa = listSave[i];
string name = sa.cubeName;
float a = (float)sa.x;
float b = (float)sa.y;
float c = (float)sa.z;
float d = (float)sa.l;
float e = (float)sa.m;
float f = (float)sa.n;
float w = (float)sa.w;
Vector3 v = new Vector3(a, b, c);
Quaternion bodyAppearRotation = new Quaternion(d, e, f, w);
boxBody = Instantiate(boxBody, v, bodyAppearRotation);
GameObject newCube = GameObject.Find("newCube");
boxBody.transform.parent = newCube.transform;
boxBody.name = name;
}
sql.ConnClose();
GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = true;
}
private void SetGame(Save save)
{
int length = save.listDouble.Count;
for (int i = 0; i < length; i++)
{
// boxBody = Instantiate(save.list[i]);
double[] dou = save.listDouble[i];
float a = (float)dou[0];
float b = (float)dou[1];
float c = (float)dou[2];
float d = (float)dou[3];
float e = (float)dou[4];
float f = (float)dou[5];
float w = (float)dou[6];
Vector3 v = new Vector3(a, b, c);
Quaternion bodyAppearRotation = new Quaternion(d, e, f, w);
// Quaternion bodyAppearRotation = Quaternion.identity;
boxBody = Instantiate(boxBody, v, bodyAppearRotation);
GameObject newCube = GameObject.Find("newCube");
boxBody.transform.parent = newCube.transform;
boxBody.name = save.cubeNames[i];
}
// Vector3 v = new Vector3(a, b, c);
// Vector3 bodyAppearPosition = new Vector3(0, 2, 0);
// Quaternion bodyAppearRotation = Quaternion.identity;
// boxBody.transform.parent = newCube.transform;
// Application.ExternalCall(boxBody.name);
// Application.ExternalEval(boxBody.name);
// GameObject.FindGameObjectWithTag("test").GetComponent<moveController>().enabled = true;
// GameObject.FindGameObjectWithTag("MainCamera").GetComponent<cameraController>().enabled = true;
}
//根据输入内容定位cube并在上方生成标签
public void selectCube(string cubeNo)
{
GameObject[] ga = GameObject.FindGameObjectsWithTag("mark");
for (int i = 0; i < ga.Length; i++)
{
Destroy(ga[i]);
}
cubeNo = this.cubeNo.text;
Save save = CreateSaveGO();
int length = save.cubeNames.Count;
if (save.cubeNames.Contains(cubeNo))
{
Debug.Log("找到了" + cubeNo);
GameObject gam = GameObject.Find(cubeNo);
Vector3 v = gam.transform.position;
Vector3 v2 = v + new Vector3(0, 1, 0);
Instantiate(mark, v2, Quaternion.identity);
}
else
{
Debug.Log("不存在" + cubeNo);
}
// boxBody.name = CreateSaveGO().cubeNames[0];
}
}
5)其余script脚本
Save 持久类(存储类型)
sqlAceess数据库连接 (暂实现查询,插入,删除三个功能代码,有需要可补充)
VectorToSave(二进制时需要,将位置信息转储为小数行式)
run(2D定位标签自转脚本,放在2D应为标签 mark预设体下)
使用sqlserver数据库需导包到项目
到unity安装目录下D:\Program Files\Unity\Editor\Data\Mono\lib\mono\unity 将以下dll文件放置到assets/Plugins文件夹下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Save
{
// public List<GameObject> list = new List<GameObject>();
public List<double[]> listDouble = new List<double[]>();
public List<float[]> listFloat = new List<float[]>();
public List<string> cubeNames = new List<string>();
public double x;
public double y;
public double z;
public double l;
public double m;
public double n;
public double w;
public string cubeName;
//public Vector3 v = new Vector3();
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using UnityEditor.MemoryProfiler;
using UnityEngine;
public class sqlAceess
{
private string connsql = "Data Source=127.0.0.1;DataBase=test;uid=sa;pwd=Oraps123";
private SqlConnection conn = new SqlConnection();
// Use this for initialization
//private void Start()
//{
// SqlConnection conn = new SqlConnection();
// //链接数据库
// Conn(conn);
// Insert(conn);
// //关闭连接 Conn这个对象本身还存在内存中,需要在使用的时候,可以直接使用
// conn.Close();
// //释放对象 Conn对象已经不存在了,下次再需要使用的时候,对象就不存在了,需要重新创建(New)
// conn.Dispose();
// Console.ReadLine();
// SqlConnection connstr = new SqlConnection("Data Source=127.0.0.1;DataBase=test;uid=sa;pwd=Oraps123");
// connstr.Close();
// connstr.Open();
// SqlCommand cmd = new SqlCommand();
// cmd.Connection = connstr;
// cmd.CommandType = System.Data.CommandType.Text;
// //设置sql连接语句
// cmd.CommandText = "delete from TEST01 where id =1";
// SqlDataAdapter sda = new SqlDataAdapter(cmd);
// sda.SelectCommand.Connection.Close();
// sda.SelectCommand.Connection.Open();
// string strtemp = sda.SelectCommand.ExecuteScalar().ToString();
// sda.SelectCommand.Connection.Close();
// // print("连接数据库成功!" + strtemp);
// connstr.Close();
// sda.SelectCommand.Connection.Close();
//}
// Update is called once per frame
//连接数据库
public void Conn()
{
//获取或设置用于打开 SQL Server 数据库的字符串
conn.ConnectionString = connsql;
try
{
//打开数据库
conn.Open();
//打印数据库连接状态
Console.WriteLine(conn.State);
}
catch (SqlException ex)
{
Console.WriteLine("数据库打开失败!");
Console.WriteLine(ex.Message);
}
}
public void ConnClose()
{
conn.Close();
conn.Dispose();
}
//insert
public void Insert(Save save)
{
String sql_insert = "insert into cubeInfo(cubeName,position_x,position_y,position_z,rotation_x,rotation_y,rotation_z,rotation_w) values(@NAME,@px,@py,@pz,@rx,@ry,@rz,@rw)";
SqlCommand cmd_insert = new SqlCommand(sql_insert, conn);
SqlParameter para1 = new SqlParameter("@NAME", save.cubeName);
cmd_insert.Parameters.Add(para1);
SqlParameter para2 = new SqlParameter("@px", save.x);
cmd_insert.Parameters.Add(para2);
SqlParameter para3 = new SqlParameter("@py", save.y);
cmd_insert.Parameters.Add(para3);
SqlParameter para4 = new SqlParameter("@pz", save.z);
cmd_insert.Parameters.Add(para4);
SqlParameter para5 = new SqlParameter("@rx", save.l);
cmd_insert.Parameters.Add(para5);
SqlParameter para6 = new SqlParameter("@ry", save.m);
cmd_insert.Parameters.Add(para6);
SqlParameter para7 = new SqlParameter("@rz", save.n);
cmd_insert.Parameters.Add(para7);
SqlParameter para8 = new SqlParameter("@rw", save.w);
cmd_insert.Parameters.Add(para8);
//对连接执行 Transact-SQL 语句并返回受影响的行数
int res_1 = cmd_insert.ExecuteNonQuery();
Console.WriteLine(res_1);
}
//update
public void update()
{
string sql_update = "update Table_1 set name=@NAME where id=@ID;";
SqlCommand cmd_update = new SqlCommand(sql_update, conn);
cmd_update.Parameters.AddWithValue("@ID", "3");
cmd_update.Parameters.AddWithValue("@NAME", "Bit100");
int res_2 = cmd_update.ExecuteNonQuery();
Console.WriteLine(res_2);
}
//delete
public void delete()
{
string sql_delete = "DELETE FROM cubeInfo ";
SqlCommand cmd_delete = new SqlCommand(sql_delete, conn);
int res_3 = cmd_delete.ExecuteNonQuery();
//string sql_delete = "DELETE FROM Table_1 WHERE name=@NAME;";
//SqlCommand cmd_delete = new SqlCommand(sql_delete, conn);
//cmd_delete.Parameters.AddWithValue("@NAME", "Bit106");
//int res_3 = cmd_delete.ExecuteNonQuery();
//Console.WriteLine(res_3);
}
//select
public List<Save> select()
{
List<Save> listSave = new List<Save>();
//定义查询语句
String sql = "select * from cubeInfo";
SqlCommand sqlComm = new SqlCommand(sql, conn);
//接收查询到的sql数据
SqlDataReader reader = sqlComm.ExecuteReader();
//读取数据
while (reader.Read())
{
// save.cubeName = reader["cubeName"].ToString();
Save save = new Save();
save.cubeName = reader.GetString(2);
save.x = reader.GetDouble(3);
save.y = reader.GetDouble(4);
save.z = reader.GetDouble(5);
save.l = reader.GetDouble(6);
save.m = reader.GetDouble(7);
save.n = reader.GetDouble(8);
save.w = reader.GetDouble(9);
listSave.Add(save);
/**
* vector 中xyz等坐标都是float类型 坐标存为float时 SqlDataReader读取却只能为double 不然报错 double丢失精度
* 目前将save里float改为了double类型 目测可以改为存为string 取出来后再转float
*/
//float ss = (float)reader.GetDouble(3);
//save.x = float.Parse(reader.GetValue(3).ToString());
//// float sss = reader.GetFloat(4);
//save.x = reader.GetFloat(3);
//save.y = (float)reader.GetValue(4);
//save.x = reader["position_x"].;
//save.y = reader["position_y"].ToString();
//reader["position_z"].ToString();
//reader["rotation_x"].ToString();
//reader["rotation_y"].ToString();
//reader["rotation_z"].ToString();
//reader["rotation_w"].ToString();
//打印
// Console.WriteLine(reader["uid"].ToString());
// Console.WriteLine(reader["name"].ToString());
}
reader.Close();
return listSave;
}
//调用存储过程
public void procedure()
{
SqlCommand cmd = new SqlCommand("testInsert", conn);
cmd.CommandType = CommandType.StoredProcedure;//告知执行存储过程
//传参数
cmd.Parameters.AddWithValue("@Uid", "106");
cmd.Parameters.AddWithValue("@Name", "Bit106");
int res = cmd.ExecuteNonQuery();
Console.WriteLine(res);
}
//批量写入
public void insertBulk()
{
DataTable dt = GetTableSchema();
SqlBulkCopy bulkCopy = new SqlBulkCopy(conn);
//获取服务器上目标表的名称
bulkCopy.DestinationTableName = "Table_1";
bulkCopy.BatchSize = dt.Rows.Count;
for (int i = 0, j = 107; i < 100; i++, j++)
{
//创建与该表结构相同的行
DataRow dr = dt.NewRow();
dr[1] = j;
dr[2] = "Bit" + j;
dt.Rows.Add(dr);
}
if (dt != null && dt.Rows.Count != 0)
{
try
{
//将内存中数据表的记录写到服务器上的目标表中
bulkCopy.WriteToServer(dt);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
//Console.WriteLine(string.Format("插入{0}条记录", 100));
}
private static DataTable GetTableSchema()
{
//内存中建一个数据表
DataTable dt = new DataTable();
//获取该数据表的列
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("id",typeof(int)),
new DataColumn("uid",typeof(int)),
new DataColumn("name",typeof(string))});
return dt;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class run : MonoBehaviour
{
public GameObject Axis;//轴,用于选择围绕中心
public float RotateSpeed;//旋转速度// Use this for initialization
// Use this for initialization
private void Start()
{
}
// Update is called once per frame
private void Update()
{
this.transform.RotateAround(Axis.transform.position, Vector3.up, RotateSpeed);
}
}
后续再看情况更新…
相关文档