首先看一下效果:
下面应该是270度,大家别在意!
地址插件效果:
以下是代码:
using Assets.Script.Iss.Common.Events.Basic;
using Assets.Script.MainView.Events;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class RatateViewControl : MonoBehaviour {
public RectTransform _back;
public RectTransform _zhizhen;
public Camera _camera;
// Update is called once per frame
void Update () {
if(Input.touchCount == 1)
{
Vector3 pos = _back.position;
pos = _camera.WorldToScreenPoint(pos);
Vector3 lef = new Vector3(pos.x, 0, 0);
Vector3 v3 = _camera.WorldToScreenPoint(Input.GetTouch(0).position);
pos = v3 - pos;
float angle = angle_360(pos, lef);
Debug.Log(angle);
_zhizhen.eulerAngles = new Vector3(0, 0, -angle);
EventBus.GetDispatcher().DispatchEvent(new RoutateEvent(RoutateEvent.routate, -angle));
}
}
float angle_360(Vector3 from_, Vector3 to_)
{
Vector3 v3 = Vector3.Cross(from_, to_);
if (v3.z > 0)
return Vector3.Angle(from_, to_);
else
return 360 - Vector3.Angle(from_, to_);
}
}
首先我们得拿到中心点就是pos,并且把pos的空间转换到屏幕坐标!
然后拿到lef,就是向右的向量,然拿到当前点击的坐标就是v3,求到他们的夹角向量,然后通过叉乘求得两个向量的夹角,给指针的叫角度!
地址插件的代码:
using Assets.Script.Utils.AddressUtils.Data;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class AddressUtils : MonoBehaviour {
public GameObject _view;
public GameObject viewontant;
/// <summary>
/// 子项
/// </summary>
public Button _item;
/// <summary>
/// 省数据
/// </summary>
private List<string> _ProvinceData = new List<string>();
private List<Button> _items = new List<Button>();
public GameObject _contant;
private Vector3 _ver3 = new Vector3(350, -99, 0);
/// <summary>
/// 开始
/// </summary>
private void Start()
{
_ProvinceData.Add("");
_ProvinceData.Add("湖南");
_ProvinceData.Add("湖北");
_ProvinceData.Add("安徽");
_ProvinceData.Add("广东");
_ProvinceData.Add("北京");
_ProvinceData.Add("浙江");
_ProvinceData.Add("江西");
_ProvinceData.Add("河南");
_ProvinceData.Add("河北");
_ProvinceData.Add("浙江");
_ProvinceData.Add("安徽");
_ProvinceData.Add("黑龙江");
_ProvinceData.Add("吉林");
_ProvinceData.Add("山西");
_ProvinceData.Add("陕西");
_ProvinceData.Add("贵州");
_ProvinceData.Add("福建");
_ProvinceData.Add("海南");
_ProvinceData.Add("广西");
_ProvinceData.Add("四川");
_ProvinceData.Add("云南");
_ProvinceData.Add("重庆");
_ProvinceData.Add("内蒙古");
_ProvinceData.Add("甘肃");
_ProvinceData.Add("西藏");
_ProvinceData.Add("陕西");
_ProvinceData.Add("");
UpdateProvince();
}
/// <summary>
/// 刷新地址数据
/// </summary>
private void UpdateProvince()
{
for (int i = 0; i < _ProvinceData.Count; i++)
{
Button item = Instantiate(_item);
item.name = _ProvinceData[i];
item.GetComponent<ItemScript>()._address = _ProvinceData[i];
item.transform.SetParent(_contant.transform);
item.transform.localPosition = new Vector3(item.transform.localPosition.x, item.transform.localPosition.y, _contant.transform.position.z);
item.transform.localScale = new Vector3(1, 1, 1);
_items.Add(item);
}
}
void Update()
{
float vec = _contant.GetComponent<RectTransform>().anchoredPosition.y;
float height = _item.GetComponent<RectTransform>().sizeDelta.y;
float currntfloat = vec / height;
int currnt = (int)(vec / height);
float ck = (currntfloat - currnt) * height;
if (ck > 60)
{
currnt += 1;
_contant.GetComponent<RectTransform>().anchoredPosition= new Vector2(0, currnt * height);
}
Debug.Log(currnt);
for (int i = 0; i < _items.Count; i++)
{
if (i == currnt + 1)
{
_items[i].GetComponent<ItemScript>()._ison = true;
}
else
{
_items[i].GetComponent<ItemScript>()._ison = false;
}
}
}
}