using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
//成员变量
//SerializeField凡是显示在Inspector(检查器) 中的属性都同时具有Serialize功能(序列化的意思是说再次读取Unity时序列化的变量是
有值的,不需要你再次去赋值,因为它已经被保存下来)。
1. public 变量
在没有加入任何Attribute的前提下,public变量是默认被视为可以被Serialize的。所以public声明的变量在Inspector
面板中是可见的。而Private变量在Inspector视图面板是不可见的。
2. [SerializeField] Attribute
强制unity去序列化一个私有域。这是一个内部的unity序列化功能,有时候我们需要Serialize一个private或者protected的属性,
这个时候可以使用[SerializeField]这个Attribute:之后就可以在面板看到该变量。
[SerializeField] float pageSpeed = 0.5f; //速度变量
[SerializeField] List<Transform> pages; //页面列表
int index = -1; //记录当前页面
bool rotate = false;
[SerializeField] GameObject backButton;
[SerializeField] GameObject forwardButton;
private void Start()
{
InitialState();
}
public void InitialState() //初始状态
{
for (int i = 0; i < pages.Count; i++) //页面列表中的页面个数
{
pages[i].transform.rotation = Quaternion.identity;//无旋转Quaternion.identity就是指Quaternion(0,0,0,0),就是每旋转前的初始角度,是一个确切的值,而transform.rotation是指本物体的角度,值是不确定的,比如可以这么设置transform.rotation = Quaternion.identity;一个是值类型,一个是属性变量
}
pages[0].SetAsLastSibling();//保持第一页在最上层想要将某个UI层保持在最上层,有两种方法:1 直接在Hierarchy面板中手动调整UI元素的顺序。2 用调用SetAsLastSibling
函数用代码实现。
backButton.SetActive(false); //初始不能按right键
}
public void RotateForward() //left按钮
{
if (rotate == true) { return; }
index++;
float angle = 180;
ForwardButtonActions();
pages[index].SetAsLastSibling();
StartCoroutine(Rotate(angle ,true)); //启动协同程序
}
public void ForwardButtonActions()
{
if (backButton.activeInHierarchy == false) //判断right按钮是否激活 (前翻即可开启)activeSelf==物体自身;activeInHierarchy==物体自身及其所有祖先物体==物体在场景中实际上是否激活
{
backButton.SetActive(true);
}
if (index == pages.Count - 1)//到达最后一页
{
forwardButton.SetActive(false);
}
}
public void RotateBack()
{
if(rotate == true ) {return ; }
float angle = 0;
pages[index].SetAsLastSibling();
BackButtonActive();
StartCoroutine(Rotate(angle ,false));
}
public void BackButtonActive()
{
if (forwardButton.activeInHierarchy == false)
{
forwardButton.SetActive(true);
}
if (index - 1 == -1) //到达首页
{
backButton.SetActive(false);
}
}
IEnumerator Rotate(float angle,bool forward) //定义协程
{
float value = 0f;
while (true)
{
rotate = true;
Quaternion targetRotation = Quaternion.Euler(0, angle, 0);//欧拉角转换为四元数 转动目标度数
transform.rotation界面显示是欧拉角,实际打印是四元数
value += Time.deltaTime * pageSpeed;
pages[index].rotation = Quaternion.Slerp(pages[index].rotation, targetRotation, value);//翻页
Quaternion.Slerp(Quaternion from ,Quaternion to, float t)叫球面线形插值
@param from 为起始方向
@param to 为终止方向
@ param t = 0.1 可以理解为速度,通常取值为0< t <= 1
float angle1 = Quaternion.Angle(pages[index].rotation, targetRotation);
if(angle1 < 0.1f)
{
if(forward == false)
{
index--;
}
rotate = false ;
break;
}
yield return null;
}
}
}