ict.xunfei/Assets/Scripts/UAV/UAVManager.cs

1632 lines
54 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DG.Tweening;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.SceneManagement;
/// <summary>
/// 公共指令
/// </summary>
public enum PublicCommond
{
/// <summary>
/// 初始化场景
/// </summary>
init_scene,
/// <summary>
/// 加载音频
/// </summary>
audio_load,
/// <summary>
/// 播放音频
/// </summary>
audio_play,
/// <summary>
/// 暂停音频
/// </summary>
audio_pause,
/// <summary>
/// 停止音频
/// </summary>
audio_stop,
/// <summary>
/// 设置音量
/// </summary>
audio_set_volume,
/// <summary>
/// 截图
/// </summary>
screen_shot,
/// <summary>
// 获取所有可替换的场景照片
/// </summary>
get_control_image,
/// <summary>
/// 设置背景照片
/// </summary>
set_control_image,
/// <summary>
/// 获取所有可创建的场景物体
/// </summary>
get_scene_objet,
/// <summary>
/// 设置场景元素物体
/// </summary>
set_scene_objet,
/// <summary>
/// 相机模式
/// </summary>
set_camera_mode
}
public enum UAVCommand
{
/// <summary>
/// 创建
/// </summary>
init_position,
/// <summary>
/// 设置名称
/// </summary>
set_name,
/// <summary>
/// 设置颜色
/// </summary>
set_color,
/// <summary>
/// 启动
/// </summary>
start_engine,
/// <summary>
/// 关闭
/// </summary>
shut_down_engine,
/// <summary>
/// 设置旋翼动力
/// </summary>
set_rotor_power,
/// <summary>
/// 方向向量控制飞行
/// </summary>
fly_by_3d_direction,
/// <summary>
/// 时间控制定点飞行
/// </summary>
fly_to_point_by_time,
/// <summary>
/// 速度控制定点飞行
/// </summary>
fly_to_point_by_speed,
/// <summary>
/// 悬停
/// </summary>
hovering,
/// <summary>
/// 启用避障
/// </summary>
enable_obstacle_avoidance,
/// <summary>
/// 禁用避障
/// </summary>
disable_obstacle_avoidance,
/// <summary>
/// 编队控制
/// </summary>
formation_control,
/// <summary>
/// 控制高亮
/// </summary>
open_lighter,
/// <summary>
/// 关闭高亮
/// </summary>
close_lighter,
/// <summary>
/// 轨迹渲染
/// </summary>
open_trail_render,
/// <summary>
/// 关闭轨迹渲染
/// </summary>
close_trail_render,
/// <summary>
/// 获取当前高度
/// </summary>
get_current_height,
/// <summary>
/// 获取当前距离
/// </summary>
get_current_distance,
/// <summary>
/// 获取当前姿态
/// </summary>
get_current_attitude_angle,
/// <summary>
/// 获取当前水平速度
/// </summary>
get_current_horizontal_speed,
/// <summary>
/// 获取当前垂直速度
/// </summary>
get_current_vertical_speed,
/// <summary>
/// 打开模拟图传
/// </summary>
open_hd,
/// <summary>
/// 关闭模拟图传
/// </summary>
close_hd,
/// <summary>
/// 设置昼夜
/// </summary>
time_set,
/// <summary>
/// 打开摄像头
/// </summary>
open_real_camera,
/// <summary>
/// 关闭摄像头
/// </summary>
close_real_camera,
/// <summary>
/// 获取语音识别结果
/// </summary>
get_speech_text,
/// <summary>
/// 打开碰撞碰撞
/// </summary>
openCollider,
/// <summary>
/// 关闭碰撞
/// </summary>
close_collider,
/// <summary>
/// 单无人机飞立方体
/// </summary>
draw_fly_Cube,
/// <summary>
/// 单无人机飞球体
/// </summary>
draw_fly_Sphere,
/// <summary>
/// 单无人机飞圆柱
/// </summary>
draw_fly_Cylinder,
/// <summary>
/// 单无人机飞圆锥
/// </summary>
draw_fly_Cone
}
public class UAVManager : MonoBehaviour
{
public static UAVManager Instance;
private GameObject templete;
/// <summary>
/// 无人机模板
/// </summary>
public GameObject Templete { get { if (templete == null) templete = Resources.Load("Prefabs/UAV") as GameObject; return templete; } }
/// <summary>
/// 使用全局坐标
/// </summary>
public bool useGlobalPosition;
[SerializeField]
private Transform uav_parent;
/// <summary>
/// 无人机生成父物体
/// </summary>
public Transform UAVParent
{
get
{
if (uav_parent == null)
Init();
return uav_parent;
}
}
/// <summary>
/// 创建无人机间隔
/// </summary>
public float create_distance = 1;
/// <summary>
/// 所有创建的无人机对象
/// </summary>
public List<GameObject> UAVs = new List<GameObject>();
/// <summary>
/// 所有无人机模拟控制器对象
/// </summary>
public List<UAVSimulator> uav_simulator = new List<UAVSimulator>();
/// <summary>
/// 所有无人机控制器对象
/// </summary>
public List<UAVController> uav_controller = new List<UAVController>();
/// <summary>
/// 碰撞层
/// </summary>
public LayerMask ColliderLayer;
/// <summary>
/// 场景元素物体
/// </summary>
private List<GameObject> sceneObject = new List<GameObject>();
#region
public Material day_skybox;
public Material night_skybox;
public Light direction_light;
public GameObject night_environment;
public Material trail_material;
#endregion
#region Editor
public Vector3 pos;//创建单无人机位置
public Vector2 size;//创建无人机阵列大小
public Vector4 quat;//四旋翼各速度
/// <summary>
/// 各向速度修正
/// </summary>
public float rise_modify, descend_modify, move_modify, rotate_modify;
/// <summary>
/// 无人机飞至指定位置
/// </summary>
public Vector3 tar_pos = new Vector3(5, 5, 5);
/// <summary>
/// 是否控制所有无人机
/// </summary>
public bool all_uav;
/// <summary>
/// 无人机单控编号
/// </summary>
public int uav_index = 1;
/// <summary>
/// 无人机固定飞行速度
/// </summary>
public float fly_speed = 2;
/// <summary>
/// 无人机固定飞行时间
/// </summary>
public float fly_time = 2;
public string array_light_json_data;
public string array_position_json_data;
public string array_position_json_data2;
#endregion
private void Awake()
{
Instance = this;
}
private void Start()
{
Init();
MyServer.instance.SetHandler_wrj(PythonDataHandler);
MyServer.instance.SetHandler_other((data) =>
{
var command = (PublicCommond)Enum.Parse(typeof(PublicCommond), data["commond"].ToString());
var eventid = data["event_id"].ToObject<int>();
//后添加
// ScoreManager.Instance.UpdateScore(command.ToString());
switch (command)
{
case PublicCommond.init_scene:
//清理无人机
ClearAllUavs();
//关闭摄像头
MainCanvasManager.webcam_panel.gameObject.SetActive(false);
//重置分数
ScoreManager.Instance.ResetScore();
//关闭媒体音乐
MediaPlayer.Instance.AudioStop();
//切回自由模式
Camera.main.transform.GetComponent<CameraMove>().enabled = true;
transform.GetComponent<MyCameraRoate>().EndRoate();
//清理场景元素
sceneObject.ForEach(a =>
{
Destroy(a);
});
sceneObject.Clear();
//隐藏ide面板
//MainCanvasManager.Instance.transform.Find("ide设置面板").gameObject.SetActive(false);
MyServer.instance.SendMsgToSDK(eventid, ResultStatus.SUCCESS);
break;
case PublicCommond.audio_load:
var __file_name = data["filepath"].ToObject<string>();
MediaPlayer.Instance.NewAudioLoad(__file_name, (result, msg) =>
{
ConsolePanel.ConsoleOutput("语音加载" + (result == true ? "完成:" : "失败:" + msg), "log");
DoReturn(result, eventid, msg);
});
break;
case PublicCommond.audio_play:
MediaPlayer.Instance.AudioPlay();
break;
case PublicCommond.audio_pause:
MediaPlayer.Instance.AudioPause();
break;
case PublicCommond.audio_stop:
MediaPlayer.Instance.AudioStop();
break;
case PublicCommond.audio_set_volume:
var __volume = data["volume"].ToObject<float>();
MediaPlayer.Instance.AudioSetVolume(__volume);
break;
case PublicCommond.screen_shot:
bool isStep = data["isStep"].ToObject<bool>();
string stepName = data["stepName"].ToObject<string>();
if (!isStep)
{
MainCanvasManager.Instance.ScreemShot(CallForTest.instance.pathTaskFile + "/任务.png");
}
else
{
MainCanvasManager.Instance.ScreemShot(CallForTest.instance.pathTaskFile + "/步骤_" + stepName + ".png");
}
break;
case PublicCommond.get_control_image:
List<string> tmpNames = new List<string>();
List<MyCardItem> list = GameObject.FindObjectsByType<MyCardItem>(FindObjectsInactive.Exclude, FindObjectsSortMode.None).ToList();
list.ForEach(a =>
{
if (!string.IsNullOrEmpty(a.Nameid))
{
tmpNames.Add(a.Nameid);
}
});
DoReturn(true, eventid, JsonConvert.SerializeObject(tmpNames));
break;
case PublicCommond.set_control_image:
{
string name = data["name"].ToString();
string filePath = data["filePath"].ToString();
MyCardItem item = GameObject.FindObjectsByType<MyCardItem>(FindObjectsInactive.Exclude, FindObjectsSortMode.None).ToList().Find(a => a.Nameid == name);
if (item != null)
{
item.ChangeTexture(filePath, (isok, str) =>
{
DoReturn(isok, eventid, str);
});
}
}
break;
case PublicCommond.get_scene_objet:
{
List<string> names = new List<string>();
var tmps = Resources.LoadAll<GameObject>("sceneObject").ToList();
tmps.ForEach(a =>
{
names.Add(a.name);
});
DoReturn(true, eventid, JsonConvert.SerializeObject(names));
}
break;
case PublicCommond.set_scene_objet:
{
string name = data["name"].ToString();
float[] point = data["point"].ToObject<float[]>();
float[] rotate = data["rotate"].ToObject<float[]>();
GameObject obj = Resources.Load<GameObject>("sceneObject/" + name);
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate<GameObject>(obj, UAVParent, true);
sceneObject.Add(sceneObj);
sceneObj.transform.localPosition = new Vector3(point[0], point[1], point[2]);
sceneObj.transform.localEulerAngles = new Vector3(rotate[0], rotate[1], rotate[2]);
DoReturn(true, eventid, "设置成功");
}
else
{
DoReturn(false, eventid, "不存在此场景元素");
}
}
break;
//问题待解决
case PublicCommond.set_camera_mode:
{
//设置相机模式
var mode = data["mode"].ToObject<string>();
if (mode == "自由模式")
{
Camera.main.transform.GetComponent<CameraMove>().enabled = true;
transform.GetComponent<MyCameraRoate>().EndRoate();
}
else if (mode == "环绕模式")
{
var center = data["center"].ToObject<float[]>();
var radius = data["radius"].ToObject<float>();
var tmpspeed = data["speed"].ToObject<float>();
var high = data["high"].ToObject<float>();
Camera.main.transform.GetComponent<CameraMove>().enabled = false;
Vector3 tmpc=new Vector3(center[0], center[1], center[2]);
transform.GetComponent<MyCameraRoate>().StartRoate(Camera.main, UAVParent.position + tmpc, radius, tmpspeed, high);
}
}
break;
default:
break;
}
});
ClearAllUavs();
MainCanvasManager.on_reset_scene += ResetScene;
}
private void OnDestroy()
{
MainCanvasManager.on_reset_scene -= ResetScene;
}
public void Init()
{
if (GameObject.Find("GameCenter") != null)
uav_parent = GameObject.Find("GameCenter").transform;
else
{
Debug.Log("未找到GameCenter");
if (ConsolePanel.Instance != null)
ConsolePanel.ConsoleOutput("未找到GameCenter", "warning");
}
}
/// <summary>
/// 重置场景
/// </summary>
public void ResetScene()
{
ClearAllUavs();
UIScene.Instance.Reset();
UIScene.Instance.ResetCameraTransform();
}
#region
/// <summary>
/// 从位置创建新无人机
/// </summary>
/// <param name="_pos"></param>
public bool CreateNewUAV(Vector3 _pos, bool _isarray = false, int _uav_number = 0)
{
//检测范围内是否有无人机
if (Physics.CheckSphere(_pos, 0.5f, 1 << 6) && !_isarray)
return false;
var newt = Instantiate(Templete, UAVParent);
UAVs.Add(newt);
if (useGlobalPosition)
newt.transform.position = _pos;
else
newt.transform.localPosition = _pos;
newt.transform.SetAsLastSibling();
newt.SetActive(true);
var uav = newt.GetComponentInChildren<UAVController>();
var moni2 = newt.GetComponentInChildren<UAVSimulator>();
moni2.Init();
uav_simulator.Add(moni2);
moni2.uav_id = _uav_number == 0 ? uav_simulator.Count : _uav_number;
uav_controller.Add(uav);
return true;
}
/// <summary>
/// 更新无人机名称
/// </summary>
/// <param name="_uav_number"></param>
/// <param name="_name"></param>
/// <returns></returns>
public bool UpdateUavName(int _uav_number, string _name)
{
var uav = uav_simulator.Find(x => x.uav_id == _uav_number);
if (uav == null)
return false;
uav.name = _name;
return true;
}
/// <summary>
/// 更新无人机颜色
/// </summary>
/// <param name="_uav_number"></param>
/// <param name="_color_1"></param>
/// <param name="_color_2"></param>
/// <returns></returns>
public bool UpdateUavColor(int _uav_number, Color _color_1, Color _color_2)
{
var uav = uav_simulator.Find(x => x.uav_id == _uav_number);
if (uav == null)
return false;
uav.UpdateModelColor(_color_1, _color_2);
//UnityEngine.ColorUtility.TryParseHtmlString(_color, out Color __color);
Debug.Log(_color_1);
//todo
return true;
}
/// <summary>
/// 根据id启动无人机
/// </summary>
/// <param name="number"></param>
public bool StartUav(int id)
{
var uav = uav_simulator.Find(x => x.uav_id == id);
if (uav == null)
{
Debug.Log("id 未找到");
return false;
}
else
{
uav.StartUav();
return true;
}
}
/// <summary>
/// 根据id关闭无人机
/// </summary>
/// <param name="id"></param>
public bool ShutdownUav(int id)
{
var uav = uav_simulator.Find(x => x.uav_id == id);
if (uav == null)
{
Debug.Log("id 未找到");
return false;
}
else
{
uav.ShutDownUAV();
return true;
}
}
/// <summary>
/// 设置旋翼速度
/// </summary>
/// <param name="_number"></param>
/// <param name="_power"></param>
public void SetRotorPower(int _number, float[] _power)
{
var _uav = uav_simulator.Find(x => x.uav_id == _number);
if (_uav != null)
{
_uav.ManualSpeed();
_uav.f1 = _power[0]; _uav.f2 = _power[1];
_uav.f3 = _power[2]; _uav.f4 = _power[3];
}
}
/// <summary>
/// 给定速度朝方向飞行
/// </summary>
/// <param name="_number"></param>
/// <param name="_direction"></param>
/// <param name="_speed"></param>
/// <param name="_time"></param>
public void Fly_By_Direction(int _number, Vector3 _direction, float _speed, float _time)
{
var _uav = uav_simulator.Find(x => x.uav_id == _number);
if (_uav != null)
{
//_uav.uav_id
_uav.FlyByDirection(_direction, _speed, _time);
}
}
/// <summary>
/// 以固定时间飞至指定地点
/// 最终使用方法
/// </summary>
/// <param name="_number"></param>
/// <param name="_target"></param>
/// <param name="_time"></param>
public void Fly_To_Target_By_Time(int _number, Vector3 _target, float _time, int _event_id)
{
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToTargetByTime(_target, _time, (_success) =>
{
if (_success)
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
});
}
/// <summary>
/// 以固定速度飞至指定地点
/// 最终使用方法
/// </summary>
/// <param name="_number"></param>
/// <param name="_target"></param>
/// <param name="_fly_speed"></param>
public void Fly_To_Target_By_Speed(int _number, Vector3 _target, float _fly_speed, int _event_id)
{
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToTargetBySpeed(_target, _fly_speed, (_success) =>
{
if (_success)
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
});
}
/// <summary>
/// 保持悬停
/// </summary>
/// <param name="_number"></param>
public void Hovering(int _number)
{
uav_simulator.Find(x => x.uav_id.Equals(_number))?.HoveringController();
}
/// <summary>
/// 启用自动避障
/// </summary>
public void EnableObstacleAvoidance(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.controller.autoStopBeforeCollision = true;
_u.controller.on_collision_warning += OnUavCollisionWarning;
}
}
/// <summary>
/// 关闭自动避障
/// </summary>
public void DisableObstacleAvoidance(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.controller.autoStopBeforeCollision = false;
}
}
/// <summary>
/// 编队控制
/// </summary>
/// <param name="_json_data"></param>
/// <returns></returns>
public float Formation_Control(string _json_data)
{
var jds = JsonConvert.DeserializeObject<UavIndexData[]>(_json_data);
var __max_time = 0f;
var __current_time = 0f;
for (int i = 0; i < jds.Length; i++)
{
__current_time = uav_simulator[jds[i].uav_index - 1].HandleUavTimeData(jds[i]);
if (__current_time > __max_time)
__max_time = __current_time;
}
return __max_time;
}
/// <summary>
/// 打开灯光
/// </summary>
/// <param name="_number"></param>
/// <param name="_parameters"></param>
public void Open_Lighter(int _number, JObject _parameters)
{
string _color = _parameters["color"].ToObject<string>();
//float _intensity = _parameters["intensity"].ToObject<float>();
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.OpenLighter(_color);
}
}
/// <summary>
/// 关闭灯光
/// </summary>
/// <param name="_number"></param>
public void Close_Lighter(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.CloseLighter();
}
}
/// <summary>
/// 打开轨迹渲染
/// </summary>
/// <param name="_number"></param>
/// <param name="_jobject"></param>
public void Open_Trail_Render(int _number, JObject _jobject)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
var trail_color_str = _jobject["parameters"]["color"].ToObject<string>();
UnityEngine.ColorUtility.TryParseHtmlString(trail_color_str, out Color _color);
var trail_thickness = _jobject["parameters"]["thickness"].ToObject<float>();
_u.uav_trail_render.Open(_color, trail_thickness,false);
}
}
/// <summary>
/// 关闭轨迹渲染
/// </summary>
/// <param name="_number"></param>
public void Close_Trail_Render(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.uav_trail_render.Close();
}
}
/// <summary>
/// 获取当前高度
/// </summary>
/// <param name="_number"></param>
/// <returns></returns>
public float Get_Current_Height(int _number)
{
var _height = -1f;
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_height = _u.controller.transform.localPosition.y;
}
return (float)System.Math.Round(_height, 1);
}
/// <summary>
/// 获取当前水平距离
/// </summary>
/// <param name="_number"></param>
/// <returns></returns>
public float Get_Current_Distance(int _number)
{
var _distance = -1f;
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_distance = Mathf.Sqrt(_u.controller.transform.localPosition.x * _u.controller.transform.localPosition.x + _u.controller.transform.localPosition.z * _u.controller.transform.localPosition.z);
}
return (float)System.Math.Round(_distance, 1);
}
/// <summary>
/// 获取当前姿态角
/// </summary>
/// <param name="_number"></param>
/// <returns></returns>
public Vector3 Get_Current_Attitude_Angle(int _number)
{
var _attitude_angle = Vector3.zero;
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_attitude_angle = _u.controller.transform.localEulerAngles;
}
return _attitude_angle;
}
/// <summary>
/// 获取当前水平速度
/// </summary>
/// <param name="_number"></param>
/// <returns></returns>
public float Get_Current_Horizontal_Speed(int _number)
{
var _horizontal_speed = 0f;
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_horizontal_speed = Mathf.Sqrt(_u.controller.rigidBody.velocity.x * _u.controller.rigidBody.velocity.x + _u.controller.rigidBody.velocity.z * _u.controller.rigidBody.velocity.z);
//_horizontal_speed = _u.controller.horizontal_speed;
Debug.Log(_horizontal_speed);
}
return _horizontal_speed;
}
/// <summary>
/// 获取当前垂直速度
/// </summary>
/// <param name="_number"></param>
/// <returns></returns>
public float Get_Current_Vertical_Speed(int _number)
{
var _vertical_speed = 0f;
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_vertical_speed = _u.controller.rigidBody.velocity.y;
//_vertical_speed = _u.controller.vertical_speed;
Debug.Log(_vertical_speed);
}
return _vertical_speed;
}
/// <summary>
/// 打开模拟高清图传
/// </summary>
public void Open_Hd(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
UavFpsCamera.Instance.UpdateTarget(_u.uav_fps_camera_transform);
}
}
/// <summary>
/// 关闭模拟高清图传
/// </summary>
public void Close_Hd(int _number)
{
UavFpsCamera.Instance.UpdateTarget(null);
}
#endregion
/// <summary>
/// 无人机碰撞预警输出
/// </summary>
/// <param name="_msg"></param>
void OnUavCollisionWarning(string _msg)
{
Console(_msg, "warning");
}
/// <summary>
/// 更新所有速度
/// </summary>
/// <param name="fs"></param>
public void UpdateAllSpeed(Vector4 fs)
{
uav_simulator.ForEach(v =>
{
v.ManualSpeed();
v.f1 = fs.x; v.f2 = fs.y;
v.f3 = fs.z; v.f4 = fs.w;
});
}
/// <summary>
/// 启动所有无人机
/// </summary>
public void StartAll()
{
uav_simulator.ForEach(v => v.StartUav());
}
/// <summary>
/// 关闭所有无人机
/// </summary>
public void ShutdownAll()
{
uav_simulator.ForEach(v => v.ShutDownUAV());
}
/// <summary>
/// 重置所有无人机位置、状态
/// </summary>
public void ResetAll()
{
uav_simulator.ForEach(v => v.ResetUAV());
}
/// <summary>
/// 设置所有无人机上升速度矫正
/// </summary>
/// <param name="modify"></param>
public void SetAllRiseModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.rise_speed_modify = modify);
}
/// <summary>
/// 设置所有无人机下降速度矫正
/// </summary>
/// <param name="modify"></param>
public void SetAllDescendModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.descend_speed_modify = modify);
}
/// <summary>
/// 设置所有无人机移动速度矫正
/// </summary>
/// <param name="modify"></param>
public void SetAllMoveModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.move_speed_modify = modify);
}
/// <summary>
/// 设置所有无人机旋转速度矫正
/// </summary>
/// <param name="modify"></param>
public void SetAllRotateModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.rotate_speed_modify = modify);
}
/// <summary>
/// 创建无人机阵列
/// </summary>
/// <param name="size"></param>
public void CreateUavArray(Vector2 size)
{
ClearAllUavs();
for (int i = 0; i < size.x; i++)
{
for (int j = 0; j < size.y; j++)
{
CreateNewUAV(new Vector3(i, 0, j) * create_distance, true);//无人机阵列创建调用
}
}
}
/// <summary>
/// 清除所有无人机
/// </summary>
public void ClearAllUavs()
{
for (int i = 0; i < UAVs.Count; i++)
{
Destroy(UAVs[i].gameObject);
}
UAVs.Clear();
uav_simulator.Clear();
uav_controller.Clear();
}
/// <summary>
/// 固定速度飞至指定坐标
/// </summary>
/// <param name="tar_pos"></param>
/// <param name="index"></param>
/// <param name="fly_speed"></param>
public void Fly2TargetBySpeed(Vector3 tar_pos, int index, float fly_speed)
{
if (tar_pos.y > 0 && Mathf.Abs(tar_pos.x) < 100 && Mathf.Abs(tar_pos.z) < 100)
{
var moni = uav_simulator[index - 1];
moni.ToTargetBySpeed(tar_pos, fly_speed);
}
else
{
Debug.Log("超出范围![100,100]");
}
}
/// <summary>
/// 固定时间飞至指定坐标
/// </summary>
/// <param name="tar_pos"></param>
/// <param name="index"></param>
/// <param name="fly_time"></param>
public void Fly2TargetByTime(Vector3 tar_pos, int index, float fly_time)
{
if (tar_pos.y > 0 && Mathf.Abs(tar_pos.x) < 100 && Mathf.Abs(tar_pos.z) < 100)
{
var moni = uav_simulator[index - 1];
moni.ToTargetByTime(tar_pos, fly_time);
}
else
{
Debug.Log("超出范围![100,100]");
}
}
/// <summary>
/// 设置当前时间
/// </summary>
/// <param name="_event_id"></param>
/// <param name="_time"></param>
public void Time_Set(int _event_id, string _time)
{
if (_time == "昼" || _time == "夜")
{
if (GameManager.current_scene_time != _time)
{
var _scene = GameManager.current_scene + "_" + _time;
if (SceneManager.GetSceneByName(_scene) != null)
{
GameManager.current_scene_time = _time;
SceneOverlayManager.Instance.LoadSceneAsync(_scene, true, ((_async) =>
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS);
Console("切换场景[" + _scene + "]成功!");
}));
}
else
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.FAILED_WARNING);
Console("切换场景[" + _scene + "]失败!", "warning");
}
}
else
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS);
Console("当前场景时间为[" + _time + "]");
}
}
else
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.FAILED_WARNING, "切换场景失败!请输入“昼”或“夜”来切换场景时间!");
Console("切换场景失败!请输入“昼”或“夜”来切换场景时间!", "warning");
}
}
/// <summary>
/// 打开摄像头
/// </summary>
public void Open_Real_Camera()
{
MainCanvasManager.webcam_panel.OnActive(true);
}
/// <summary>
/// 关闭摄像头
/// </summary>
public void Close_Real_Camera()
{
MainCanvasManager.webcam_panel.OnNagetive(false);
}
#region
#if UNITY_EDITOR
public string color_value;
public float color_intensity;
private void Update()
{
if (Input.GetKeyDown(KeyCode.L))
{
uav_simulator[0].OpenLighter(color_value, color_intensity);
}
if (Input.GetKeyDown(KeyCode.R))
{
uav_simulator[0].CloseLighter();
}
}
#endif
#endregion
/// <summary>
/// 第三数据类型,无人机编组数据
/// </summary>
public string uav_index_json_data;
/// <summary>
/// 无人机矩阵飞行数据
/// 分发至每个无人机各自执行
/// </summary>
public void UavTimeDataHandle()
{
var jds = JsonConvert.DeserializeObject<UavIndexData[]>(uav_index_json_data);
for (int i = 0; i < jds.Length; i++)
{
uav_simulator[jds[i].uav_index - 1].HandleUavTimeData(jds[i]);
}
}
/// <summary>
/// 选择环境时间
/// </summary>
public void SwitchEnvironmentTime(bool use_night)
{
if (use_night)
{
//day_skybox.SetFloat("_Exposure", 0);
RenderSettings.skybox = night_skybox;
direction_light.intensity = 0.01f;
night_environment.SetActive(true);
}
else
{
//day_skybox.SetFloat("_Exposure", 1);
RenderSettings.skybox = day_skybox;
direction_light.intensity = 0.45f;
night_environment.SetActive(false);
}
}
/// <summary>
/// 打开录音面板,并开始语音识别
/// </summary>
/// <param name="v"></param>
/// <param name="number"></param>
/// <returns></returns>
private void Openmicrophone(int number,Action<bool,string> callback)
{
RobotUI.Instance.OpenPanel(RobotePanelEnum.RecordPanel.ToString()).GetComponent<RecordPanel>().Init(number, callback);
//if (MicrophoneInput.instance.CheckMicrophone())
//{
// RobotUI.Instance.OpenPanel(RobotePanelEnum.RecordPanel.ToString()).GetComponent<RecordPanel>().Init(number,callback);
//}
//else
//{
// callback(false,"错误:无麦克风");
//}
}
public void PythonDataHandler(JObject _jobject)
{
//数据格式{"type": "wrj", "commond": "create", "pos": [0, 0], "number": 1, "eventid": 1}
var _command = (UAVCommand)Enum.Parse(typeof(UAVCommand), _jobject["commond"].ToString());
var _event_id = _jobject["event_id"].ToObject<int>();
int _number = -1;
if (_jobject["number"] != null)
_number = _jobject["number"].ToObject<int>();
JObject _parameters = null;
if (_jobject["parameters"] != null)
_parameters = _jobject["parameters"].ToObject<JObject>();
ScoreManager.Instance.UpdateScore(_command.ToString());
switch (_command)
{
case UAVCommand.init_position:
var pos = _jobject["pos"].ToObject<float[]>();
Console(string.Format("设置[{0}]号无人机初始化:[{1},{2}]", _number, pos[0], pos[1]));
bool isCreate = CreateNewUAV(new Vector3(pos[0], 0, pos[1]), false, _number);
DoReturn(isCreate, _event_id, isCreate==true? "创建无人机成功!": "创建无人机失败! ");
break;
case UAVCommand.set_name:
var name = _jobject["name"].ToObject<string>();
Console(string.Format("设置[{0}]号无人机名称:{1}", _number, name));
DoReturn(UpdateUavName(_number, name), _event_id, "更新名称成功!");
break;
case UAVCommand.set_color:
//var uav_color_1 = _jobject["color_1"].ToObject<Color>();
//var uav_color_2 = _jobject["color_2"].ToObject<Color>();
if (UnityEngine.ColorUtility.TryParseHtmlString(_jobject["color_1"].ToObject<string>(), out var uav_color_1)
&& UnityEngine.ColorUtility.TryParseHtmlString(_jobject["color_2"].ToObject<string>(), out var uav_color_2))
{
Console(string.Format("设置[{0}]号无人机颜色区域1{1}区域2{2}", _number, uav_color_1, uav_color_2));
DoReturn(UpdateUavColor(_number, uav_color_1, uav_color_2), _event_id, "");
}
else
{
DoReturn(false, _event_id, "颜色代码错误!");
}
break;
case UAVCommand.start_engine:
Console(string.Format("启动[{0}]号无人机引擎", _number));
DoReturn(StartUav(_number), _event_id, "启动引擎成功!");
break;
case UAVCommand.shut_down_engine:
Console(string.Format("关闭[{0}]号无人机引擎", _number));
DoReturn(ShutdownUav(_number), _event_id, "关闭引擎成功!");
break;
case UAVCommand.set_rotor_power:
var _power = _jobject["parameters"]["power"].ToObject<float[]>();
SetRotorPower(_number, _power);
Console(string.Format("设置[{0}]号无人机旋翼速度", _number));
break;
case UAVCommand.fly_by_3d_direction://不会下降
var direction = _jobject["direction"].ToObject<float[]>();
var speed = _jobject["speed"].ToObject<float>();
var time = _jobject["time"].ToObject<float>();
Fly_By_Direction(_number, new Vector3(direction[0], direction[1], direction[2]), speed, time);
Console(string.Format("[{0}]号无人机以速度:{1}米每秒,方向[{2},{3},{4}],飞行{5}秒", _number, speed, direction[0], direction[1], direction[2], time));
break;
case UAVCommand.fly_to_point_by_time:
var _fly_by_time_target = _jobject["direction"].ToObject<float[]>();
var _fly_time = _jobject["duration"].ToObject<float>();
Fly_To_Target_By_Time(_number, new Vector3(_fly_by_time_target[0], _fly_by_time_target[1], _fly_by_time_target[2]), _fly_time, _event_id);
Console(string.Format("[{0}]号无人机在:{1}秒内,飞行至[{2},{3},{4}]", _number, _fly_time, _fly_by_time_target[0], _fly_by_time_target[1], _fly_by_time_target[2]));
break;
case UAVCommand.fly_to_point_by_speed://会下降
var _fly_by_speed_target = _jobject["direction"].ToObject<float[]>();
var _fly_speed = _jobject["duration"].ToObject<float>();
Fly_To_Target_By_Speed(_number, new Vector3(_fly_by_speed_target[0], _fly_by_speed_target[1], _fly_by_speed_target[2]), _fly_speed, _event_id);
Console(string.Format("[{0}]号无人机在:{1}秒内,飞行至[{2},{3},{4}]", _number, _fly_speed, _fly_by_speed_target[0], _fly_by_speed_target[1], _fly_by_speed_target[2]));
break;
case UAVCommand.hovering:
Hovering(_number);
Console(string.Format("[{0}]号无人机悬停", _number));
break;
case UAVCommand.enable_obstacle_avoidance:
EnableObstacleAvoidance(_number);
Console(string.Format("打开[{0}]号无人机自动避障", _number));
break;
case UAVCommand.disable_obstacle_avoidance:
DisableObstacleAvoidance(_number);
Console(string.Format("关闭[{0}]号无人机自动避障", _number));
break;
//问题待解决
case UAVCommand.formation_control:
var __formation_data = _jobject["formation_data"].ToObject<string>();
var __wait_for_return = _jobject["wait_for_return"].ToObject<bool>();
var __max_time = Formation_Control(__formation_data);
if (__wait_for_return)
{
//在最大时间后返回结果
var __t = 0f;
DOTween.To(() => __t, (t) => __t = t, __max_time, __max_time).OnComplete(() =>
{
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS);
});
}
Console(string.Format("编队控制"));
break;
case UAVCommand.open_lighter:
Open_Lighter(_number, _parameters);
Console(string.Format("打开[{0}]号无人机灯光", _number));
break;
case UAVCommand.close_lighter:
Close_Lighter(_number);
Console(string.Format("关闭[{0}]号无人机灯光", _number));
break;
case UAVCommand.open_trail_render:
Open_Trail_Render(_number, _jobject);
Console(string.Format("[{0}]号无人机启动轨迹渲染", _number));
break;
case UAVCommand.close_trail_render:
Close_Trail_Render(_number);
Console(string.Format("[{0}]号无人机关闭轨迹渲染", _number));
break;
case UAVCommand.get_current_height:
var _current_height = Get_Current_Height(_number);
Console(string.Format("[{0}]号无人机当前高度为:{1:F1}", _number, _current_height));
DoReturn(true, _event_id, _current_height);
break;
case UAVCommand.get_current_distance:
var _current_distance = Get_Current_Distance(_number);
Console(string.Format("[{0}]号无人机当前距离为:{1}", _number, _current_distance));
DoReturn(true, _event_id, _current_distance);
break;
case UAVCommand.get_current_attitude_angle:
var _current_attitude_angle = Get_Current_Attitude_Angle(_number);
Console(string.Format("[{0}]号无人机当前旋转角为:{1}", _number, _current_attitude_angle.ToString(":F2")));
DoReturn(true, _event_id, _current_attitude_angle);
break;
case UAVCommand.get_current_horizontal_speed:
var _current_horizontal_speed = Get_Current_Horizontal_Speed(_number);
//Console(string.Format("[{0}]号无人机当前水平速度为:{1}", _number, _current_horizontal_speed));
//DoReturn(true, _event_id, _current_horizontal_speed);
DoReturn(true, _event_id, "此方法暂时不可使用");
break;
case UAVCommand.get_current_vertical_speed:
var _current_vertical_speed = Get_Current_Vertical_Speed(_number);
//Console(string.Format("[{0}]号无人机当前垂直速度为:{1}", _number, _current_vertical_speed));
//DoReturn(true, _event_id, _current_vertical_speed);
DoReturn(true, _event_id, "此方法暂时不可使用");
break;
case UAVCommand.open_hd:
Open_Hd(_number);
Console(string.Format("[{0}]号无人机高清图传功能", _number));
break;
case UAVCommand.close_hd:
Close_Hd(_number);
Console(string.Format("[{0}]号无人机高清图传功能", _number));
break;
case UAVCommand.time_set:
var t_time = _jobject["t_time"].ToObject<string>();
Time_Set(_event_id, t_time);
break;
case UAVCommand.open_real_camera:
Open_Real_Camera();
ConsolePanel.ConsoleOutput("执行动作:" + "打开摄像头", "log");
break;
case UAVCommand.close_real_camera:
Close_Real_Camera();
ConsolePanel.ConsoleOutput("执行动作:" + "关闭摄像头", "log");
break;
case UAVCommand.get_speech_text:
RobotUI.Instance.Init();
Openmicrophone(_number, (isok, result) =>
{
DoReturn(isok, _event_id, result);
});
break;
//问题待解决
case UAVCommand.openCollider:
{
//打开碰撞
UAVSimulator uavs = uav_simulator.Find(a => a.uav_id == _number);
uavs.transform.parent.Find("_Drone [Quad]").GetComponents<Collider>().ToList().ForEach(a =>
{
a.enabled = true;
});
//设置无人机不掉下去
uavs.StartUav();
uavs.AutoSpeed();
uavs.f1 = uavs.f2 = uavs.f3 = uavs.f4 = 5;
}
break;
case UAVCommand.close_collider:
{
//关闭碰撞
UAVSimulator uavs = uav_simulator.Find(a => a.uav_id == _number);
uavs.transform.parent.Find("_Drone [Quad]").GetComponents<Collider>().ToList().ForEach(a =>
{
a.enabled = false;
});
}
break;
case UAVCommand.draw_fly_Cube:
{
//飞立方体
List<float[]> firstPoint = _jobject["points"].ToObject<List<float[]>>();
List<Vector3> p = new List<Vector3>();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float length = _jobject["length"].ToObject<float>();
float wighth = _jobject["wighth"].ToObject<float>();
float high = _jobject["high"].ToObject<float>();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject<float>();
float thick = _jobject["thickness"].ToObject<float>();
float tmptime = _jobject["time"].ToObject<float>();
float[] center = _jobject["center"].ToObject<float[]>();
UnityEngine.ColorUtility.TryParseHtmlString(color, out Color _color);
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToPathByTime(p, tmptime, _color, thick, (_success) =>
{
if (_success)
{
//透明度
_color.a = alpha;
//生成cube
GameObject obj = Resources.Load<GameObject>("sceneObject/Cube");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate<GameObject>(obj, UAVParent, true);
sceneObject.Add(sceneObj);
sceneObj.transform.localPosition = new Vector3(center[0], center[1], center[2]);
sceneObj.transform.localScale = new Vector3(length, high, wighth);
sceneObj.GetComponent<Renderer>().material.color= _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Sphere:
{
//飞球体
List<float[]> firstPoint = _jobject["points"].ToObject<List<float[]>>();
List<Vector3> p = new List<Vector3>();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject<float>();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject<float>();
float thick = _jobject["thickness"].ToObject<float>();
float tmptime = _jobject["time"].ToObject<float>();
float[] center = _jobject["center"].ToObject<float[]>();
UnityEngine.ColorUtility.TryParseHtmlString(color, out Color _color);
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToPathByTime(p, tmptime, _color, thick, (_success) =>
{
if (_success)
{
//透明度
_color.a = alpha;
//生成cube
GameObject obj = Resources.Load<GameObject>("sceneObject/Sphere");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate<GameObject>(obj, UAVParent, true);
sceneObject.Add(sceneObj);
sceneObj.transform.localPosition = new Vector3(center[0], center[1], center[2]);
sceneObj.transform.localScale = new Vector3(radius*2, radius*2, radius*2);
sceneObj.GetComponent<Renderer>().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Cylinder:
{
//飞圆柱体
List<float[]> firstPoint = _jobject["points"].ToObject<List<float[]>>();
List<Vector3> p = new List<Vector3>();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject<float>();
float high = _jobject["high"].ToObject<float>();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject<float>();
float thick = _jobject["thickness"].ToObject<float>();
float tmptime = _jobject["time"].ToObject<float>();
float[] center = _jobject["center"].ToObject<float[]>();
UnityEngine.ColorUtility.TryParseHtmlString(color, out Color _color);
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToPathByTime(p, tmptime, _color, thick, (_success) =>
{
if (_success)
{
//透明度
_color.a = alpha;
//生成cube
GameObject obj = Resources.Load<GameObject>("sceneObject/Cylinder");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate<GameObject>(obj, UAVParent, true);
sceneObject.Add(sceneObj);
sceneObj.transform.localPosition = new Vector3(center[0], center[1], center[2]);
sceneObj.transform.localScale = new Vector3(radius * 2, high/2, radius * 2);
sceneObj.GetComponent<Renderer>().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Cone:
{
//飞圆柱体
List<float[]> firstPoint = _jobject["points"].ToObject<List<float[]>>();
List<Vector3> p = new List<Vector3>();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject<float>();
float high = _jobject["high"].ToObject<float>();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject<float>();
float thick = _jobject["thickness"].ToObject<float>();
float tmptime = _jobject["time"].ToObject<float>();
float[] center = _jobject["center"].ToObject<float[]>();
UnityEngine.ColorUtility.TryParseHtmlString(color, out Color _color);
uav_simulator.Find(x => x.uav_id.Equals(_number))?.ToPathByTime(p, tmptime, _color, thick, (_success) =>
{
if (_success)
{
//透明度
_color.a = alpha;
//生成cube
GameObject obj = Resources.Load<GameObject>("sceneObject/Cone");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate<GameObject>(obj, UAVParent, true);
sceneObject.Add(sceneObj);
sceneObj.transform.localPosition = new Vector3(center[0], center[1], center[2]);
sceneObj.transform.localScale = new Vector3(radius , high , radius);
sceneObj.GetComponent<Renderer>().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
default:
break;
}
}
/// <summary>
/// 执行并返回结果
/// </summary>
/// <param name="_success"></param>
/// <param name="_eventid"></param>
/// <param name="_result"></param>
private void DoReturn(bool _success, int _eventid, object _result = null)
{
if (_success)
MyServer.instance.SendMsgToSDK(_eventid, ResultStatus.SUCCESS, _result.ToString());
else
MyServer.instance.SendMsgToSDK(_eventid, ResultStatus.FAILED_ERROR, _result.ToString());
}
private void Console(string _message, string _type = "log")
{
ConsolePanel.ConsoleOutput(_message, _type);//输出无人机信息
}
}
#region
/// <summary>
/// 无人机阵列数据
/// </summary>
public class UavIndexData
{
/// <summary>
/// 无人机编号
/// </summary>
public int uav_index;
public UavTimeData[] uav_time_data;
}
public class UavTimeData
{
/// <summary>
/// 时间
/// </summary>
public float time;
/// <summary>
/// 坐标
/// </summary>
public string position;
/// <summary>
/// 灯光颜色
/// </summary>
public string color;
/// <summary>
/// 灯光强度
/// </summary>
public float intensity;
}
#endregion