/// /// 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; } } }