實際運行效果:

Unity - MainMenu.unity - New Unity Project 26 - PC, Mac & Linux Standalone

編輯環境效果:

Unity - MainMenu.unity - New Unity Project 26 - PC, Mac & Linux Standalone_2

請先在場景中建立五個 Plane 平面物件,之後在 Level Switch 中 Size 輸入5,把剛剛5個Plane平面物件一個一個拉進去。
之後在 Image 中輸入圖片數量(最好超過五個),再將各圖片拉進去。
之後按下執行,用鍵盤按左右建,即可看見圖片切換效果。

Unity - MainMenu.unity - New Unity Project 26 - PC, Mac & Linux Standalone_3  

程式碼(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];
}
}



}
}

arrow
arrow
    全站熱搜

    黃彥霖 發表在 痞客邦 留言(1) 人氣()