翻页代码

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

}

posted @ 2024-12-19 15:32  yheyi  阅读(33)  评论(0)    收藏  举报