Brain_Arduino/Assets/Scripts/GameManager.cs

134 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System.Text;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public string startMsg = "START";
public string stopMsg = "STOP";
public AudioPlayControl videoControl;
private bool isCanControlModel = false;
public Transform brainTrans;
public float dt = 0.1f;
public bool isTestInput = false;
float angleX, angleY, angleZ;
public void Awake()
{
SampleMessageListener.OnReceivedMSG += OnReceivedMessage;
brainTrans.gameObject.SetActive(false);
}
private void OnDestroy()
{
SampleMessageListener.OnReceivedMSG -= OnReceivedMessage;
}
private void OnReceivedMessage(string msgStr)
{
if (msgStr == startMsg)
{
print($"开始游戏");
GamePlay();
}
else if (msgStr == stopMsg)
{
print($"退出游戏");
Application.Quit();
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#endif
}
else
{
sb?.AppendLine(msgStr);
var arr = msgStr.Split(',');
//加速度
var ax = float.Parse(arr[0]);
var ay = float.Parse(arr[1]);
var az = float.Parse(arr[2]);
//角速度
var gx = float.Parse(arr[3]);
var gy = float.Parse(arr[4]);
var gz = float.Parse(arr[5]);
print($"获得加速度:{ax},{ay},{az}");
print($"获得角速度:{gx},{gy},{gz}");
if (isCanControlModel)
{
// 时间间隔
float dt = 0.01f;
// 通过加速度计算姿态(俯仰角和滚转角)
float roll = Mathf.Atan2(ay, az) * Mathf.Rad2Deg; // 滚转角
float pitch = Mathf.Atan2(-ax, Mathf.Sqrt(ay * ay + az * az)) * Mathf.Rad2Deg; // 俯仰角
// 积分得到角度变化
angleX = gx * dt; // 绕X轴旋转
angleY = gy * dt; // 绕Y轴旋转
angleZ = gz * dt; // 绕Z轴旋转
// 使用互补滤波来平滑姿态估计
// 这里的系数决定了加速度和陀螺仪的权重通常设置为0.98
float alpha = 0.98f; // 互补滤波的权重
float filteredPitch = alpha * (angleX) + (1 - alpha) * pitch; // 过滤后的俯仰角
float filteredRoll = alpha * (angleY) + (1 - alpha) * roll; // 过滤后的滚转角
ControlModelRotate(new Vector3(filteredRoll, filteredPitch, angleZ)); // 传入过滤后的值
}
}
}
private async void GamePlay()
{
await videoControl.PlayStartVideo();
JustGamePlayNoAnim();
}
private void JustGamePlayNoAnim()
{
isCanControlModel = true;
brainTrans.gameObject.SetActive(true);
}
private void ControlModelRotate(Vector3 angleModify)
{
brainTrans.rotation = Quaternion.Euler(angleModify);
}
private StringBuilder sb;
private void Update()
{
if (isTestInput)
{
if (Input.GetKeyDown(KeyCode.Alpha1))
{
OnReceivedMessage(startMsg);
}
if (Input.GetKey(KeyCode.Alpha2))
{
float randomF() => Random.Range(0.0f, 1.0f);
OnReceivedMessage($"{randomF()},{randomF()},{randomF()},{randomF()},{randomF()},{randomF()}");
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
OnReceivedMessage(stopMsg);
}
else if (Input.GetKeyDown(KeyCode.F))
{
videoControl.StopPlay();
JustGamePlayNoAnim();
}
if (Input.GetKeyDown(KeyCode.Z))
{
Debug.LogWarning("开始录制");
sb = new StringBuilder();
}
if (Input.GetKeyDown(KeyCode.X))
{
Debug.LogWarning($"录制结束! 参数:\n{sb}");
sb = null;
}
}
}
}