将脚本挂在 球体上,public List<Transform> mObjList; 存储 要停留的位置,public Transform mControlObj; 固定计算的位置,用于其他四个位置 往这个位置去。
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class CircleManager : MonoBehaviour {
private Vector3 mousePos;
public Transform mControlObj;
public List<Transform> mObjList;
private Vector3 mControlTran;
private Vector3 mItemTran;
private Quaternion FinallQuaternion;
private bool IsMove =false;
void Update () {
if(SaveManager.IsOpenMainUI)
{
if (Input.GetMouseButtonDown(0))
{
IsMove =false;
StopCoroutine("OnMouseDown");
StartCoroutine("OnMouseDown");
}
if(IsMove)
{
transform.rotation = Quaternion.Lerp(transform.rotation, FinallQuaternion, 0.2f);
}
}
}
IEnumerator OnMouseDown()
{
mousePos = Input.mousePosition;
while(Input.GetMouseButton(0))
{
Vector3 offset = mousePos - Input.mousePosition;
if(offset.x!=0)
transform.Rotate(Vector3.up * offset.x*0.1f, Space.World);
if(offset.y!=0)
transform.Rotate(Vector3.right*(-1)*offset.y*0.1f,Space.World);
mousePos=Input.mousePosition;
yield return null;
}
yield return new WaitForSeconds(0.1f);
EndCaculate();
yield return new WaitForSeconds(0.2f);
IsMove = false;
}
private void EndCaculate()
{
Vector3 first=mControlObj.position - transform.position;
Vector3 second;
float angle =361.0f;
int Index = 0;
Vector3 NeedCaculate =Vector3.zero;
for(int i=0;i<mObjList.Count;i++)
{
second = mObjList[i].position - transform.position;
float angles = Vector3.Angle(second,first);
if(Mathf.Abs(angles) < Mathf.Abs(angle))
{
angle =Mathf.Abs(angles);
Index = i;
}
}
if(Index ==1||Index ==2 ||Index ==0)
MonoManager.Ins.CallFuncWithSingleInstance("MainUIManager", "OpenVipScreen");
else
MonoManager.Ins.CallFuncWithSingleInstance("MainUIManager", "CloseVipScreen");
FinallQuaternion = CalculateRotation(mObjList[Index].position);
IsMove =true;
}
//计算球面上点 hitPoint 朝向主摄像机时球的 rotation
private Quaternion CalculateRotation(Vector3 hitPoint)
{
// 获取物体 到球心的向量
Vector3 v1 = hitPoint - transform.position;
// 获取参照物 到球心的向量
Vector3 v2 = mControlObj.position - transform.position;
// 球进行旋转即是以通过球心且和 v1、v2 组成界面垂直的向量(法向量)为旋转轴
// v1 和 v2 叉乘,获取 v1、v2 组成界面的法向量
Vector3 cross = Vector3.Cross(v1, v2);
// 球绕旋转轴旋转的角度为 v1 和 v2 的夹角
// 获取向量 v1、v2 的夹角
float angle = Vector3.Angle(v1, v2);
//获取球以 cross 为旋转轴 旋转angle 角度的 四元数
Quaternion quaternion = Quaternion.AngleAxis(angle, cross);
// 这样错误, 必须要 quaternion 左乘 tr.rotation
//return tr.rotation * quaternion;
return quaternion * transform.rotation;
}
}