在unity中运行某段程序时往往需要运行另外一段不相干但是却对功能上有需求的程序,比如进行场景传送,在传送点处,点击I键,屏幕慢慢变黑,场景传送到另外一个场景,场景又慢慢变亮。这里首先涉及两个物体,一个是传送触发器物体,点击I键,过一段时间后进行场景传送,另外一个就是遮罩物体,这里使用UGUI中的Panel,变黑和变亮主要修改它的透明度。达成上诉效果可以使用到以下几种方式:一,将panel物体作为触发器物体的参数物体,触发其物体执行panel中的代码,或者直接对panel物体进行操作。二,消息传送,触发器物体将点击I后的状态值保存在某个类的static值中,然后panel物体根据static的值做出相应的操作。
很明显在上面两个问题中,第一个很容易造成程序依赖性过强,程序结构臃肿,相对的第二个用于功能不相干的程序协作是最好的选择,下面是代码:
消息存储代码:
public class SceneControl : MonoBehaviour {
[SerializeField]
public static int state;//0正常,1改变场景,2交互
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
场景切换的触发器代码:
public class StreetChanger : MonoBehaviour {
public string sceneName;//需要切换的场景名称
public float transTime;切换场景需要的时间,有需要也可以将其初始值存于消息代码的static值里面
// Update is called once per frame
void Update () {
if (SceneControl.state == 1) {
transTime -= Time.deltaTime;
if (transTime <= 0) SceneManager.LoadScene(sceneName);
}
}
private void OnTriggerStay2D(Collider2D collision)
{
if(collision.gameObject.tag.Equals("Player")&&Input.GetKeyDown(KeyCode.I))//当有按键按下时改变state的值
SceneControl.state = 1;
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
场景变色的效果代码:
public class SceneExChangeEffect : MonoBehaviour {
Image image;
public Color black;
public Color white;
[Range(1,8)]
public float smooth;
// Use this for initialization
void Start () {
image = GetComponent<Image>();
image.color = black;
}
// Update is called once per frame
void Update () {
//柑橘state的值做出相应的操作
if (SceneControl.state == 0)
{
image.color = Color.Lerp(image.color, white, Time.deltaTime*smooth);
}
else {
image.color = Color.Lerp(image.color, black, Time.deltaTime*smooth);
}
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
消息初始化和一般功能程序:
在场景中有时需要反复用到一些单一功能的程序,比如UI按钮按下时的一些操作,比如场景切换,物体显示或者隐藏等,可以将这些程序存储到一个功能类下
public class GeneralControl : MonoBehaviour {
private void Awake()
{
SceneControl.state = 0;//初始化消息值
}
隐藏物体
public void HideGameObject(GameObject gameObject)
{
if (gameObject.activeSelf) gameObject.SetActive(false);
}
显示物体
public void ShowGameObject(GameObject gameObject)
{
if (!gameObject.activeSelf) gameObject.SetActive(true);
}
加载场景
public void LoadScene(string sceneName)
{
SceneManager.LoadScene(sceneName);
}
程序退出
public void ApplicationQuit()
{
Application.Quit();
}
}