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;
///
/// 公共指令
///
public enum PublicCommond
{
///
/// 初始化场景
///
init_scene,
///
/// 加载音频
///
audio_load,
///
/// 播放音频
///
audio_play,
///
/// 暂停音频
///
audio_pause,
///
/// 停止音频
///
audio_stop,
///
/// 设置音量
///
audio_set_volume,
///
/// 截图
///
screen_shot,
///
// 获取所有可替换的场景照片
///
get_control_image,
///
/// 设置背景照片
///
set_control_image,
///
/// 获取所有可创建的场景物体
///
get_scene_objet,
///
/// 设置场景元素物体
///
set_scene_objet,
///
/// 相机模式
///
set_camera_mode
}
public enum UAVCommand
{
///
/// 创建
///
init_position,
///
/// 设置名称
///
set_name,
///
/// 设置颜色
///
set_color,
///
/// 启动
///
start_engine,
///
/// 关闭
///
shut_down_engine,
///
/// 设置旋翼动力
///
set_rotor_power,
///
/// 方向向量控制飞行
///
fly_by_3d_direction,
///
/// 时间控制定点飞行
///
fly_to_point_by_time,
///
/// 速度控制定点飞行
///
fly_to_point_by_speed,
///
/// 悬停
///
hovering,
///
/// 启用避障
///
enable_obstacle_avoidance,
///
/// 禁用避障
///
disable_obstacle_avoidance,
///
/// 编队控制
///
formation_control,
///
/// 控制高亮
///
open_lighter,
///
/// 关闭高亮
///
close_lighter,
///
/// 轨迹渲染
///
open_trail_render,
///
/// 关闭轨迹渲染
///
close_trail_render,
///
/// 获取当前高度
///
get_current_height,
///
/// 获取当前距离
///
get_current_distance,
///
/// 获取当前姿态
///
get_current_attitude_angle,
///
/// 获取当前水平速度
///
get_current_horizontal_speed,
///
/// 获取当前垂直速度
///
get_current_vertical_speed,
///
/// 打开模拟图传
///
open_hd,
///
/// 关闭模拟图传
///
close_hd,
///
/// 设置昼夜
///
time_set,
///
/// 打开摄像头
///
open_real_camera,
///
/// 关闭摄像头
///
close_real_camera,
///
/// 获取语音识别结果
///
get_speech_text,
///
/// 打开碰撞碰撞
///
openCollider,
///
/// 关闭碰撞
///
close_collider,
///
/// 单无人机飞立方体
///
draw_fly_Cube,
///
/// 单无人机飞球体
///
draw_fly_Sphere,
///
/// 单无人机飞圆柱
///
draw_fly_Cylinder,
///
/// 单无人机飞圆锥
///
draw_fly_Cone
}
public class UAVManager : MonoBehaviour
{
public static UAVManager Instance;
private GameObject templete;
///
/// 无人机模板
///
public GameObject Templete { get { if (templete == null) templete = Resources.Load("Prefabs/UAV") as GameObject; return templete; } }
///
/// 使用全局坐标
///
public bool useGlobalPosition;
[SerializeField]
private Transform uav_parent;
///
/// 无人机生成父物体
///
public Transform UAVParent
{
get
{
if (uav_parent == null)
Init();
return uav_parent;
}
}
///
/// 创建无人机间隔
///
public float create_distance = 1;
///
/// 所有创建的无人机对象
///
public List UAVs = new List();
///
/// 所有无人机模拟控制器对象
///
public List uav_simulator = new List();
///
/// 所有无人机控制器对象
///
public List uav_controller = new List();
///
/// 碰撞层
///
public LayerMask ColliderLayer;
///
/// 场景元素物体
///
private List sceneObject = new List();
#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;//四旋翼各速度
///
/// 各向速度修正
///
public float rise_modify, descend_modify, move_modify, rotate_modify;
///
/// 无人机飞至指定位置
///
public Vector3 tar_pos = new Vector3(5, 5, 5);
///
/// 是否控制所有无人机
///
public bool all_uav;
///
/// 无人机单控编号
///
public int uav_index = 1;
///
/// 无人机固定飞行速度
///
public float fly_speed = 2;
///
/// 无人机固定飞行时间
///
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();
//后添加
// 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().enabled = true;
transform.GetComponent().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();
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();
MediaPlayer.Instance.AudioSetVolume(__volume);
break;
case PublicCommond.screen_shot:
bool isStep = data["isStep"].ToObject();
string stepName = data["stepName"].ToObject();
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 tmpNames = new List();
List list = GameObject.FindObjectsByType(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(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 names = new List();
var tmps = Resources.LoadAll("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[] rotate = data["rotate"].ToObject();
GameObject obj = Resources.Load("sceneObject/" + name);
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate(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();
if (mode == "自由模式")
{
Camera.main.transform.GetComponent().enabled = true;
transform.GetComponent().EndRoate();
}
else if (mode == "环绕模式")
{
var center = data["center"].ToObject();
var radius = data["radius"].ToObject();
var tmpspeed = data["speed"].ToObject();
var high = data["high"].ToObject();
Camera.main.transform.GetComponent().enabled = false;
Vector3 tmpc=new Vector3(center[0], center[1], center[2]);
transform.GetComponent().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");
}
}
///
/// 重置场景
///
public void ResetScene()
{
ClearAllUavs();
UIScene.Instance.Reset();
UIScene.Instance.ResetCameraTransform();
}
#region 功能实现
///
/// 从位置创建新无人机
///
///
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();
var moni2 = newt.GetComponentInChildren();
moni2.Init();
uav_simulator.Add(moni2);
moni2.uav_id = _uav_number == 0 ? uav_simulator.Count : _uav_number;
uav_controller.Add(uav);
return true;
}
///
/// 更新无人机名称
///
///
///
///
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;
}
///
/// 更新无人机颜色
///
///
///
///
///
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;
}
///
/// 根据id启动无人机
///
///
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;
}
}
///
/// 根据id关闭无人机
///
///
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;
}
}
///
/// 设置旋翼速度
///
///
///
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];
}
}
///
/// 给定速度朝方向飞行
///
///
///
///
///
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);
}
}
///
/// 以固定时间飞至指定地点
/// 最终使用方法
///
///
///
///
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, "");
}
});
}
///
/// 以固定速度飞至指定地点
/// 最终使用方法
///
///
///
///
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, "");
}
});
}
///
/// 保持悬停
///
///
public void Hovering(int _number)
{
uav_simulator.Find(x => x.uav_id.Equals(_number))?.HoveringController();
}
///
/// 启用自动避障
///
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;
}
}
///
/// 关闭自动避障
///
public void DisableObstacleAvoidance(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.controller.autoStopBeforeCollision = false;
}
}
///
/// 编队控制
///
///
///
public float Formation_Control(string _json_data)
{
var jds = JsonConvert.DeserializeObject(_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;
}
///
/// 打开灯光
///
///
///
public void Open_Lighter(int _number, JObject _parameters)
{
string _color = _parameters["color"].ToObject();
//float _intensity = _parameters["intensity"].ToObject();
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.OpenLighter(_color);
}
}
///
/// 关闭灯光
///
///
public void Close_Lighter(int _number)
{
var _u = uav_simulator.Find(x => x.uav_id.Equals(_number));
if (_u != null)
{
_u.CloseLighter();
}
}
///
/// 打开轨迹渲染
///
///
///
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();
UnityEngine.ColorUtility.TryParseHtmlString(trail_color_str, out Color _color);
var trail_thickness = _jobject["parameters"]["thickness"].ToObject();
_u.uav_trail_render.Open(_color, trail_thickness,false);
}
}
///
/// 关闭轨迹渲染
///
///
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();
}
}
///
/// 获取当前高度
///
///
///
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);
}
///
/// 获取当前水平距离
///
///
///
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);
}
///
/// 获取当前姿态角
///
///
///
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;
}
///
/// 获取当前水平速度
///
///
///
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;
}
///
/// 获取当前垂直速度
///
///
///
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;
}
///
/// 打开模拟高清图传
///
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);
}
}
///
/// 关闭模拟高清图传
///
public void Close_Hd(int _number)
{
UavFpsCamera.Instance.UpdateTarget(null);
}
#endregion
///
/// 无人机碰撞预警输出
///
///
void OnUavCollisionWarning(string _msg)
{
Console(_msg, "warning");
}
///
/// 更新所有速度
///
///
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;
});
}
///
/// 启动所有无人机
///
public void StartAll()
{
uav_simulator.ForEach(v => v.StartUav());
}
///
/// 关闭所有无人机
///
public void ShutdownAll()
{
uav_simulator.ForEach(v => v.ShutDownUAV());
}
///
/// 重置所有无人机位置、状态
///
public void ResetAll()
{
uav_simulator.ForEach(v => v.ResetUAV());
}
///
/// 设置所有无人机上升速度矫正
///
///
public void SetAllRiseModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.rise_speed_modify = modify);
}
///
/// 设置所有无人机下降速度矫正
///
///
public void SetAllDescendModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.descend_speed_modify = modify);
}
///
/// 设置所有无人机移动速度矫正
///
///
public void SetAllMoveModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.move_speed_modify = modify);
}
///
/// 设置所有无人机旋转速度矫正
///
///
public void SetAllRotateModify(float modify)
{
if (modify > 0)
uav_simulator.ForEach(v => v.rotate_speed_modify = modify);
}
///
/// 创建无人机阵列
///
///
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);//无人机阵列创建调用
}
}
}
///
/// 清除所有无人机
///
public void ClearAllUavs()
{
for (int i = 0; i < UAVs.Count; i++)
{
Destroy(UAVs[i].gameObject);
}
UAVs.Clear();
uav_simulator.Clear();
uav_controller.Clear();
}
///
/// 固定速度飞至指定坐标
///
///
///
///
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]");
}
}
///
/// 固定时间飞至指定坐标
///
///
///
///
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]");
}
}
///
/// 设置当前时间
///
///
///
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");
}
}
///
/// 打开摄像头
///
public void Open_Real_Camera()
{
MainCanvasManager.webcam_panel.OnActive(true);
}
///
/// 关闭摄像头
///
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
///
/// 第三数据类型,无人机编组数据
///
public string uav_index_json_data;
///
/// 无人机矩阵飞行数据
/// 分发至每个无人机各自执行
///
public void UavTimeDataHandle()
{
var jds = JsonConvert.DeserializeObject(uav_index_json_data);
for (int i = 0; i < jds.Length; i++)
{
uav_simulator[jds[i].uav_index - 1].HandleUavTimeData(jds[i]);
}
}
///
/// 选择环境时间
///
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);
}
}
///
/// 打开录音面板,并开始语音识别
///
///
///
///
private void Openmicrophone(int number,Action callback)
{
RobotUI.Instance.OpenPanel(RobotePanelEnum.RecordPanel.ToString()).GetComponent().Init(number, callback);
//if (MicrophoneInput.instance.CheckMicrophone())
//{
// RobotUI.Instance.OpenPanel(RobotePanelEnum.RecordPanel.ToString()).GetComponent().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 _number = -1;
if (_jobject["number"] != null)
_number = _jobject["number"].ToObject();
JObject _parameters = null;
if (_jobject["parameters"] != null)
_parameters = _jobject["parameters"].ToObject();
ScoreManager.Instance.UpdateScore(_command.ToString());
switch (_command)
{
case UAVCommand.init_position:
var pos = _jobject["pos"].ToObject();
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();
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();
//var uav_color_2 = _jobject["color_2"].ToObject();
if (UnityEngine.ColorUtility.TryParseHtmlString(_jobject["color_1"].ToObject(), out var uav_color_1)
&& UnityEngine.ColorUtility.TryParseHtmlString(_jobject["color_2"].ToObject(), 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();
SetRotorPower(_number, _power);
Console(string.Format("设置[{0}]号无人机旋翼速度", _number));
break;
case UAVCommand.fly_by_3d_direction://不会下降
var direction = _jobject["direction"].ToObject();
var speed = _jobject["speed"].ToObject();
var time = _jobject["time"].ToObject();
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();
var _fly_time = _jobject["duration"].ToObject();
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();
var _fly_speed = _jobject["duration"].ToObject();
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();
var __wait_for_return = _jobject["wait_for_return"].ToObject();
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();
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().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().ToList().ForEach(a =>
{
a.enabled = false;
});
}
break;
case UAVCommand.draw_fly_Cube:
{
//飞立方体
List firstPoint = _jobject["points"].ToObject>();
List p = new List();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float length = _jobject["length"].ToObject();
float wighth = _jobject["wighth"].ToObject();
float high = _jobject["high"].ToObject();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject();
float thick = _jobject["thickness"].ToObject();
float tmptime = _jobject["time"].ToObject();
float[] center = _jobject["center"].ToObject();
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("sceneObject/Cube");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate(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().material.color= _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Sphere:
{
//飞球体
List firstPoint = _jobject["points"].ToObject>();
List p = new List();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject();
float thick = _jobject["thickness"].ToObject();
float tmptime = _jobject["time"].ToObject();
float[] center = _jobject["center"].ToObject();
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("sceneObject/Sphere");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate(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().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Cylinder:
{
//飞圆柱体
List firstPoint = _jobject["points"].ToObject>();
List p = new List();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject();
float high = _jobject["high"].ToObject();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject();
float thick = _jobject["thickness"].ToObject();
float tmptime = _jobject["time"].ToObject();
float[] center = _jobject["center"].ToObject();
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("sceneObject/Cylinder");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate(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().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
case UAVCommand.draw_fly_Cone:
{
//飞圆柱体
List firstPoint = _jobject["points"].ToObject>();
List p = new List();
firstPoint.ForEach(a =>
{
p.Add(new Vector3(a[0], a[1], a[2]));
});
float radius = _jobject["radius"].ToObject();
float high = _jobject["high"].ToObject();
string color = _jobject["color"].ToString();
float alpha = _jobject["alpha"].ToObject();
float thick = _jobject["thickness"].ToObject();
float tmptime = _jobject["time"].ToObject();
float[] center = _jobject["center"].ToObject();
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("sceneObject/Cone");
if (obj != null)
{
GameObject sceneObj = GameObject.Instantiate(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().material.color = _color;
MyServer.instance.SendMsgToSDK(_event_id, ResultStatus.SUCCESS, "");
}
}
});
}
break;
default:
break;
}
}
///
/// 执行并返回结果
///
///
///
///
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 无人机编组数据
///
/// 无人机阵列数据
///
public class UavIndexData
{
///
/// 无人机编号
///
public int uav_index;
public UavTimeData[] uav_time_data;
}
public class UavTimeData
{
///
/// 时间
///
public float time;
///
/// 坐标
///
public string position;
///
/// 灯光颜色
///
public string color;
///
/// 灯光强度
///
public float intensity;
}
#endregion