實際運行效果:
編輯環境效果:
請先在場景中建立五個 Plane 平面物件,之後在 Level Switch 中 Size 輸入5,把剛剛5個Plane平面物件一個一個拉進去。
之後在 Image 中輸入圖片數量(最好超過五個),再將各圖片拉進去。
之後按下執行,用鍵盤按左右建,即可看見圖片切換效果。
程式碼(MainMenu ):
using UnityEngine;
using System.Collections;
public class MainMenu : MonoBehaviour {
public float speed = 1.5F;
public Transform [] LevelSwich;
public Texture2D [] Image;
private Vector3 [] LevelPositionOrigin;
private Vector3 [] LevelRotationOrigin;
private RangeCount LevelSwichRangeCount = new RangeCount();
private RangeCount ImageRangeCount = new RangeCount();
void Awake () {
LevelSwichRangeCount.SetRange (0, LevelSwich.Length - 1);
ImageRangeCount.SetRange (0, Image.Length - 1);
LevelPositionOrigin = new Vector3[LevelSwich.Length];
LevelRotationOrigin = new Vector3[LevelSwich.Length];
for(int i=0; i<LevelSwich.Length; i++){
LevelPositionOrigin[i] = LevelSwich[i].position;
LevelRotationOrigin[i] = LevelSwich[i].eulerAngles;
}
LevelSwich[0].gameObject.renderer.material.mainTexture = Image[Image.Length-2];
LevelSwich[1].gameObject.renderer.material.mainTexture = Image[Image.Length-1];
LevelSwich[2].gameObject.renderer.material.mainTexture = Image[0];
LevelSwich[3].gameObject.renderer.material.mainTexture = Image[1];
LevelSwich[4].gameObject.renderer.material.mainTexture = Image[2];
}
void OnGUI(){
GUIStyle gs = new GUIStyle();
gs.fontSize = 30;
gs.normal.textColor = Color.white;
GUI.Label (new Rect(Screen.width/2-5,5, 20, 40), "" + ImageRangeCount.GetNowValue(), gs);
}
bool isLockKey = false;
void LockKey(){
isLockKey = true;
Invoke("UnLockKey", speed);
}
void UnLockKey(){
isLockKey = false;
}
bool isRight = false;
void Update () {
if(!isLockKey){
if(Input.GetKey(KeyCode.RightArrow)){
isRight = true;
LockKey();
LevelSwichRangeCount.Next();
ImageRangeCount.Next();
}else if(Input.GetKey(KeyCode.LeftArrow)){
isRight = false;
LockKey();
LevelSwichRangeCount.Previous();
ImageRangeCount.Previous();
}
}
if(isLockKey){
if(isRight){
for(int i = 0; i < LevelSwich.Length; i++){
if(i == LevelSwichRangeCount.GetNowValue()){
int lsrc = LevelSwichRangeCount.GetNowShiftValue(-1);
LevelSwich[lsrc].gameObject.renderer.material.mainTexture = Image[ImageRangeCount.GetNowShiftValue(2)];
LevelSwich[lsrc].position = LevelPositionOrigin[4];
LevelSwich[lsrc].eulerAngles = LevelRotationOrigin[4];
for(int k = 0 ; k < LevelSwich.Length-1; k++){
float tt = speed / (speed*3) / (k == 1 ? speed*2.3F : speed*6);
lsrc = LevelSwichRangeCount.GetNowShiftValue(k);
LevelSwich[lsrc].position = Vector3.Slerp(LevelSwich[lsrc].position, LevelPositionOrigin[k], tt);
LevelSwich[lsrc].eulerAngles = Vector3.Slerp(LevelSwich[lsrc].eulerAngles, LevelRotationOrigin[k], tt);
}
break;
}
}
}else{
for(int i = 0; i < LevelSwich.Length; i++){
if(i == LevelSwichRangeCount.GetNowValue()){
int lsrc = LevelSwichRangeCount.GetNowShiftValue(0);
LevelSwich[lsrc].gameObject.renderer.material.mainTexture = Image[ImageRangeCount.GetNowShiftValue(-2)];
LevelSwich[lsrc].position = LevelPositionOrigin[0];
LevelSwich[lsrc].eulerAngles = LevelRotationOrigin[0];
for(int k = 1 ; k < LevelSwich.Length; k++){
float tt = speed / (speed*3) / (k == 3 ? speed*2.3F : speed*6);
lsrc = LevelSwichRangeCount.GetNowShiftValue(k);
LevelSwich[lsrc].position = Vector3.Slerp(LevelSwich[lsrc].position, LevelPositionOrigin[k], tt);
LevelSwich[lsrc].eulerAngles = Vector3.Slerp(LevelSwich[lsrc].eulerAngles, LevelRotationOrigin[k], tt);
}
break;
}
}
}
}
}
}
程式碼(RangeCount):
using UnityEngine;
using System.Collections;
public class RangeCount : MonoBehaviour {
private int startValue = 0;
private int endValue = 0;
private int nowValue = 0;
public RangeCount(){
}
public RangeCount(int startValue, int endValue){
SetRange (startValue, endValue);
}
public void SetRange (int startValue, int endValue) {
this.startValue = startValue;
this.endValue = endValue;
this.nowValue = startValue;
}
public void SetNowValue(int nowValue){
this.nowValue = nowValue;
}
public int GetNowValue(){
return nowValue;
}
public int GetNowShiftValue(int shiftValue){
int v = nowValue;
if (shiftValue < 0) {
while(shiftValue++ < 0){
if (v - 1 < startValue) {
v = endValue;
}else{
v--;
}
}
} else if (shiftValue > 0) {
while(shiftValue-- > 0){
if (v > endValue - 1) {
v = startValue;
}else{
v++;
}
}
}
return v;
}
public int Previous () {
if (--nowValue < startValue) {
nowValue = endValue;
}
return nowValue;
}
public int Next () {
if (++nowValue > endValue) {
nowValue = startValue;
}
return nowValue;
}
}
程式碼(舊版):---------------------------------
using UnityEngine;
using System.Collections;
public class MainMenu : MonoBehaviour {
public Transform [] LevelSwich;
public Texture2D [] Image;
private Vector3 [] LevelPositionOrigin;
private Vector3 [] LevelRotationOrigin;
void Awake () {
LevelPositionOrigin = new Vector3[LevelSwich.Length];
LevelRotationOrigin = new Vector3[LevelSwich.Length];
for(int i=0; i<LevelSwich.Length; i++){
LevelPositionOrigin[i] = LevelSwich[i].position;
LevelRotationOrigin[i] = LevelSwich[i].eulerAngles;
}
for(int i = 0; i < LevelSwich.Length; i++){
LevelSwich[i].gameObject.renderer.material.mainTexture = Image[i];
}
}
bool swL = false;
bool swR = false;
float t = 0;
float t2 = 0;
int nowPage = 0;
int nowImage = 4;
float timeTarget = 1.5F;
void Update () {
if(Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.RightArrow)){
// t = 0;
}
if(Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.RightArrow)){
t2 += Time.deltaTime;
if(t2 > 3){
timeTarget = 0.4F;
}
}else{
t2 = 0;
timeTarget = 1.5F;
}
if(Input.GetKey(KeyCode.LeftArrow)){
if(!swL){
swL = true;
if(nowImage < Image.Length-1){
nowImage++;
}else{
nowImage = 0;
}
if(nowPage > 0){
nowPage--;
}else{
nowPage = 4;
}
}
}
if(Input.GetKey(KeyCode.RightArrow)){
if(!swR){
swR = true;
if(nowImage > 0){
nowImage--;
}else{
nowImage = Image.Length-1;
}
if(nowPage < LevelSwich.Length-1){
nowPage++;
}else{
nowPage = 0;
}
}
}
if(swL){
if(t < timeTarget){
t += Time.deltaTime;
}else{
swL = false;
t = 0;
}
if(nowPage==0){
LevelSwich[4].gameObject.renderer.material.mainTexture = Image[nowImage];
LevelSwich[4].position = LevelPositionOrigin[4];
LevelSwich[4].eulerAngles = LevelRotationOrigin[4];
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[0], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[0], t / (timeTarget*3));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
}else if(nowPage==1){
LevelSwich[3].gameObject.renderer.material.mainTexture = Image[nowImage];
LevelSwich[3].position = LevelPositionOrigin[4];
LevelSwich[3].eulerAngles = LevelRotationOrigin[4];
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[0], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[0], t / (timeTarget*3));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
}else if(nowPage==2){
LevelSwich[2].gameObject.renderer.material.mainTexture = Image[nowImage];
LevelSwich[2].position = LevelPositionOrigin[4];
LevelSwich[2].eulerAngles = LevelRotationOrigin[4];
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[0], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[0], t / (timeTarget*3));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
}else if(nowPage==3){
LevelSwich[1].gameObject.renderer.material.mainTexture = Image[nowImage];
LevelSwich[1].position = LevelPositionOrigin[4];
LevelSwich[1].eulerAngles = LevelRotationOrigin[4];
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[0], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[0], t / (timeTarget*3));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
}else if(nowPage==4){
LevelSwich[0].gameObject.renderer.material.mainTexture = Image[nowImage];
LevelSwich[0].position = LevelPositionOrigin[4];
LevelSwich[0].eulerAngles = LevelRotationOrigin[4];
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[0], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[0], t / (timeTarget*3));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
}
}
//--------------------------------------------------------------------------------------------
if(swR){
if(t < timeTarget){
t += Time.deltaTime;
}else{
swR = false;
t = 0;
}
int k = nowImage;
if(k > 3){
k = k-4;
}else if(k > 2){
k = Image.Length-1;
}else if(k > 1){
k = Image.Length-2;
}else if(k > 0){
k = Image.Length-3;
}else if(k == 0){
k = Image.Length-4;
}
if(nowPage==0){
LevelSwich[0].gameObject.renderer.material.mainTexture = Image[k];
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[4], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[4], t / (timeTarget*3));
LevelSwich[0].position = LevelPositionOrigin[0];
LevelSwich[0].eulerAngles = LevelRotationOrigin[0];
}else if(nowPage == 1){
LevelSwich[4].gameObject.renderer.material.mainTexture = Image[k];
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[4], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[4], t / (timeTarget*3));
LevelSwich[4].position = LevelPositionOrigin[0];
LevelSwich[4].eulerAngles = LevelRotationOrigin[0];
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
}else if(nowPage==2){
LevelSwich[3].gameObject.renderer.material.mainTexture = Image[k];
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[4], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[4], t / (timeTarget*3));
LevelSwich[3].position = LevelPositionOrigin[0];
LevelSwich[3].eulerAngles = LevelRotationOrigin[0];
}else if(nowPage==3){
LevelSwich[2].gameObject.renderer.material.mainTexture = Image[k];
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
LevelSwich[1].position = Vector3.Slerp(LevelSwich[1].position, LevelPositionOrigin[4], t / (timeTarget*3));
LevelSwich[1].eulerAngles = Vector3.Slerp(LevelSwich[1].eulerAngles, LevelRotationOrigin[4], t / (timeTarget*3));
LevelSwich[2].position = LevelPositionOrigin[0];
LevelSwich[2].eulerAngles = LevelRotationOrigin[0];
}else if(nowPage==4){
LevelSwich[1].gameObject.renderer.material.mainTexture = Image[k];
LevelSwich[2].position = Vector3.Slerp(LevelSwich[2].position, LevelPositionOrigin[1], t / (timeTarget*3));
LevelSwich[2].eulerAngles = Vector3.Slerp(LevelSwich[2].eulerAngles, LevelRotationOrigin[1], t / (timeTarget*3));
LevelSwich[3].position = Vector3.Slerp(LevelSwich[3].position, LevelPositionOrigin[2], t / (timeTarget*7));
LevelSwich[3].eulerAngles = Vector3.Slerp(LevelSwich[3].eulerAngles, LevelRotationOrigin[2], t / (timeTarget*7));
LevelSwich[4].position = Vector3.Slerp(LevelSwich[4].position, LevelPositionOrigin[3], t / (timeTarget*3));
LevelSwich[4].eulerAngles = Vector3.Slerp(LevelSwich[4].eulerAngles, LevelRotationOrigin[3], t / (timeTarget*3));
LevelSwich[0].position = Vector3.Slerp(LevelSwich[0].position, LevelPositionOrigin[4], t / (timeTarget*3));
LevelSwich[0].eulerAngles = Vector3.Slerp(LevelSwich[0].eulerAngles, LevelRotationOrigin[4], t / (timeTarget*3));
LevelSwich[1].position = LevelPositionOrigin[0];
LevelSwich[1].eulerAngles = LevelRotationOrigin[0];
}
}
}
}
留言列表