///
/// ZWN-XHJ
/// 20211019
///
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Analytics;
public enum human_area_state
{
halfbody,//半身
totalbody//全身
}
public class human_area : MonoBehaviour
{
public human_area_state human_area_state_cur;
Vector3 middle_vec, head_vec, foot_vec;
int area = 0, area_sum = 0;//当前是否在区域内计数
[HideInInspector]
public List area_list;//中心的位置
private float area_mid_maxX = 100,
area_mid_minX = -100,
area_mid_maxY = 505,
area_mid_minY = -505,
area_height = 844;//中心的范围
private float this_height, this_height_left, this_height_right;
int area_count = 15;
private bool area_true = false;//当前是否在区域内
float area_per = 0.7f;
Vector3 head, right_ankle, left_ankle;
Vector3 default_vec = new Vector3(-Screen.width, -Screen.height, 0);
float area_value = 0.5f;
float area_value_total = 0.5f;
float area_value_half = 0.5f;
void Awake()
{
if (human_area_state_cur == human_area_state.totalbody)
{
//area_height = 844;//中心的范围
area_height = 1009;//中心的范围
}
else if (human_area_state_cur == human_area_state.halfbody)
{
//area_height = 714;//中心的范围
area_height = 1009;//中心的范围
}
}
void Start()
{
/* area_mid_maxX = 100;
area_mid_minX = -100;
area_mid_maxY = 505;
area_mid_minY = -505;*/
area_mid_maxX = 274;
area_mid_minX = -274;
area_mid_maxY = 505;
area_mid_minY = -505;
if (Application.platform == RuntimePlatform.WindowsEditor
|| Application.platform == RuntimePlatform.WindowsPlayer)
{
area_count = 15;
}
if (Application.platform == RuntimePlatform.Android)// 使用Unity切换Platform无法模拟
{
area_count = 6;
}
area_value_total = PlayerPrefs.GetFloat("total");
if (area_value_total == 0)
{
area_value_total = 0.5f;
}
area_value_half = PlayerPrefs.GetFloat("half");
if (area_value_half == 0)
{
area_value_half = 0.5f;
}
if (human_area_state_cur == human_area_state.totalbody)
{
area_value = area_value_total;
text_total.text = area_value.ToString();
}
else if (human_area_state_cur == human_area_state.halfbody)
{
area_value = area_value_half;
text_half.text = area_value.ToString();
}
}
/* //使用例子
void Update()
{
print(human_area_true());
}*/
int area_num = -1;
public Text text_total;
public Text text_half;
public void total_sum()
{
area_value_total += 0.1f;
area_value = area_value_total;
PlayerPrefs.SetFloat("total", area_value_total);
text_total.text = area_value.ToString();
}
public void total_dec()
{
area_value_total -= 0.1f;
area_value = area_value_total;
PlayerPrefs.SetFloat("total", area_value_total);
text_total.text = area_value.ToString();
}
public void half_sum()
{
area_value_half += 0.1f;
area_value = area_value_half;
PlayerPrefs.SetFloat("half", area_value_half);
text_half.text = area_value.ToString();
}
public void half_dec()
{
area_value_half -= 0.1f;
area_value = area_value_half;
PlayerPrefs.SetFloat("half", area_value_half);
text_half.text = area_value.ToString();
}
/*float area_value_total = 0.5f;
float area_value_half = 0.5f;*/
//public Text show;
///
/// -1:不存在
/// 0:在区域内
/// 1:偏左
/// 2:偏右
/// 3:偏前
/// 4:偏后
/// 5:人数太多
///
///
public int human_area_true()
{
//print("common_data.single.detail_lists[3] == 1: " + (common_data.single.detail_lists[3] == 1));
/* 0:鼻子1:左眼2:右眼3:左耳4:右耳5:左肩6:右肩7:左肘
8:右肘9:左腕10:右腕11:左臀12:右臀
13:左膝14:右膝15:左脚踝16:右脚踝*/
//if (zwn_interface.single.PoseHelper.Zwn_Pose_Data_Roi)
//{
// if (zwn_interface.single.PoseHelper.zwn_pose_array_cur.count < 1)
// {
// area_num = -1;
// }
// else if (zwn_interface.single.PoseHelper.zwn_pose_array_cur.count > 1)
// {
// area_num = 5;
// }
// else
// {
// /*if (zwn_common_data.single.zwn_pose_android_cur.point.rect_xy.x < area_mid_minX)
// {
// //print("偏左");
// area_num = 1;
// }
// else if (zwn_common_data.single.zwn_pose_android_cur.point.rect_xy.x > area_mid_maxX)
// {
// //print("偏右");
// area_num = 2;
// }
// else
// {
// area_num = area_points();
// }*/
// if (zwn_common_data.single.zwn_pose_cur.point.rect_xy.x < area_mid_minX)
// {
// //print("偏左");
// area_num = 1;
// }
// else if (zwn_common_data.single.zwn_pose_cur.point.rect_xy.x > area_mid_maxX)
// {
// //print("偏右");
// area_num = 2;
// }
// else
// {
// area_num = area_points();
// }
// }
// return area_num;
//}
return -1;
}
int area_points()
{
if ((ZwnAmlogicHelperData.isSomeone == true
&& human_area_state_cur == human_area_state.totalbody
&& zwn_common_data.single.zwn_transform_pose[15] != default_vec
&& zwn_common_data.single.zwn_transform_pose[16] != default_vec)
|| (ZwnAmlogicHelperData.isSomeone == true && human_area_state_cur == human_area_state.halfbody))//是否存在整个人
{
if (human_area_state_cur == human_area_state.totalbody)
{
middle_vec = (zwn_common_data.single.zwn_transform_pose[15]
+ zwn_common_data.single.zwn_transform_pose[16]
+ zwn_common_data.single.zwn_transform_pose[11]
+ zwn_common_data.single.zwn_transform_pose[12]
+ zwn_common_data.single.zwn_transform_pose[5]
+ zwn_common_data.single.zwn_transform_pose[6]
) / 6;
foot_vec = (zwn_common_data.single.zwn_transform_pose[15]
+ zwn_common_data.single.zwn_transform_pose[16]
) / 2;
head_vec = zwn_common_data.single.zwn_transform_pose[0];
head = zwn_common_data.single.zwn_transform_pose[1];
right_ankle = zwn_common_data.single.zwn_transform_pose[15];
left_ankle = zwn_common_data.single.zwn_transform_pose[16];
if (right_ankle.y != -1 && left_ankle.y != -1)
{
if (head.y > 0 && right_ankle.y > 0)
{
this_height_right = Mathf.Abs(Mathf.Abs(head.y) - Mathf.Abs(right_ankle.y));
}
else
{
this_height_right = Mathf.Abs(Mathf.Abs(head.y) + Mathf.Abs(right_ankle.y));
}
if (head.y > 0 && left_ankle.y > 0)
{
this_height_left = Mathf.Abs(Mathf.Abs(head.y) - Mathf.Abs(left_ankle.y));
}
else
{
this_height_left = Mathf.Abs(Mathf.Abs(head.y) + Mathf.Abs(left_ankle.y));
}
this_height = Mathf.Max(this_height_right, this_height_left);
}
}
else if (human_area_state_cur == human_area_state.halfbody)
{
middle_vec = (zwn_common_data.single.zwn_transform_pose[11]
+ zwn_common_data.single.zwn_transform_pose[12]
+ zwn_common_data.single.zwn_transform_pose[5]
+ zwn_common_data.single.zwn_transform_pose[6]
) / 4;
foot_vec = (zwn_common_data.single.zwn_transform_pose[11]
+ zwn_common_data.single.zwn_transform_pose[12]
) / 2;
//head_vec = zwn_common_data.single.zwn_transform_pose[0];
//head = zwn_common_data.single.zwn_transform_pose[1];
head_vec = (zwn_common_data.single.zwn_transform_pose[5]
+ zwn_common_data.single.zwn_transform_pose[6]
) / 2;
head = (zwn_common_data.single.zwn_transform_pose[5]
+ zwn_common_data.single.zwn_transform_pose[6]
) / 2;
right_ankle = zwn_common_data.single.zwn_transform_pose[11];
left_ankle = zwn_common_data.single.zwn_transform_pose[12];
}
if (right_ankle.y != -1 && left_ankle.y != -1)
{
if (head.y > 0 && right_ankle.y > 0)
{
this_height_right = Mathf.Abs(Mathf.Abs(head.y) - Mathf.Abs(right_ankle.y));
}
else
{
this_height_right = Mathf.Abs(Mathf.Abs(head.y) + Mathf.Abs(right_ankle.y));
}
if (head.y > 0 && left_ankle.y > 0)
{
this_height_left = Mathf.Abs(Mathf.Abs(head.y) - Mathf.Abs(left_ankle.y));
}
else
{
this_height_left = Mathf.Abs(Mathf.Abs(head.y) + Mathf.Abs(left_ankle.y));
}
this_height = Mathf.Max(this_height_right, this_height_left);
}
// print("this_height: " + this_height + " area_height * 0.75f: " + area_height * 0.75f);
//show.text = "this_height: " + this_height + " area_height * 0.75f: " + area_height * 0.75f;
if (
middle_vec.x >= area_mid_minX
&& middle_vec.x <= area_mid_maxX
&& foot_vec.y >= area_mid_minY
&& foot_vec.y <= area_mid_maxY
&& head_vec.y >= area_mid_minY
&& head_vec.y <= area_mid_maxY
&& this_height >= area_height * area_value
)
{
if (area != 1)
{
area = 1;
}
}
else
{
if (area != 0)
{
area = 0;
}
}
area_list.Add(area);
if (area_sum != 0)
{
area_sum = 0;
}
if (area_list.Count >= area_count)
{
area_list.Remove(area_list[0]);
for (int i = 0; i < area_list.Count; i++)
{
area_sum += area_list[i];
}
if (area_sum >= area_count * area_per)
{
if (!area_true)
{
area_true = true;
}
}
else
{
area_true = false;
if (middle_vec.x < area_mid_minX)
{
//print("偏左");
area_num = 1;
}
else if (middle_vec.x > area_mid_maxX)
{
//print("偏右");
area_num = 2;
}
else if (this_height < area_height * area_value)
{
//print("偏后");
area_num = 4;
}
else
{
//print("偏前");
area_num = 3;
}
}
}
if (!area_true)
{
//人不在区域内
return area_num;
}
else
{
//print("人存在区域");
return 0;
}
}
else
{
area_list.Clear();
//print("人不存在");
return -1;
}
}
}