1 通过lambda表达式,模拟创建一个按钮时,参数有一个点击按钮事件的方法。
2 通过lambda表达式,通过图片的路径,显示这张图。
//Unity-lambda表达式
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
//通过lambda表达式,模拟创建一个按钮时,参数有一个点击按钮事件的方法。
//通过lambda表达式,通过图片的路径,显示这张图。
public class Demo : MonoBehaviour
{
Action buttonClick;
Action<int, string> buttonClick2;
Func<int, string, double> buttonClick3;
public Image myImage;
void Start()
{
//委托的标准写法
CreateButton(buttonClick += ButtonClickMethod);
//lambda表达式写法
CreateButton(()=>
{
Debug.Log("按钮点击事件");
});
//委托的标准写法
CreateButton2(buttonClick2 += ButtonClickMethod2);
//lambda表达式写法
CreateButton2((int intData, string strData) =>
{
Debug.Log($"按钮点击事件{intData}, {strData}");
});
//lambda表达式简化写法
CreateButton2((intData, strData) =>
{
Debug.Log($"按钮点击事件{intData}, {strData}");
});
//委托的标准写法
double myData = CreateButton3(buttonClick3 += ButtonClickMethod3);
Debug.Log($"myData = {myData}");
//lambda表达式写法会报错,lambda表达式写法,作为参数的方法不能有返回值
//CreateButton3((intData, strData) =>
//{
// Debug.Log($"按钮点击事件{intData}, {strData}");
//});
//一般lambda表达式带参数意义不是很大,如果需要带参数,如下的实例比较好。
//比较有意义的带参数的使用的lambda表达式
//拿到图片的路径,转换为Texure,然后把Texure转换为Image的sprite,Image显示出来
//路径为:Assets/StreamingAssets/a.png
StartCoroutine(GetLocalTexture(StreamingAssetsPath("a.png"), (texture) =>
{
//图片资源, new Vector4(40, 40, 40, 42))表示图片在slice模式下切四个角的大小。
Sprite spriteFromWeb =
Sprite.Create(
texture,
new Rect(0, 0, texture.width, texture.height),
new Vector2(0, 0),
100,
0,
SpriteMeshType.Tight,
new Vector4(40, 40, 40, 42));
myImage.sprite = spriteFromWeb;
}));
}
public void CreateButton(Action myButtonClick)
{
myButtonClick();
}
public void ButtonClickMethod()
{
Debug.Log("按钮点击事件");
}
public void CreateButton2(Action<int, string> myButtonClick2)
{
myButtonClick2(5, "100");
}
public void ButtonClickMethod2(int intData, string strData)
{
Debug.Log($"按钮点击事件{intData}, {strData}");
}
public double CreateButton3(Func<int, string, double> myButtonClick3)
{
return myButtonClick3(5, "100");
}
public double ButtonClickMethod3(int intData, string strData)
{
Debug.Log($"按钮点击事件{intData}, {strData}");
return Convert.ToDouble(intData) + Convert.ToDouble(strData);
}
IEnumerator GetLocalTexture(string url, Action<Texture2D> actionResult)
{
UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(url);
yield return uwr.SendWebRequest();
Texture2D myTexture = null;
if (uwr.isNetworkError || uwr.isHttpError)
{
Debug.Log($"GetLocalTexture www.error = {uwr.error}");
}
else
{
myTexture = ((DownloadHandlerTexture)uwr.downloadHandler).texture;
}
if (actionResult != null)
{
if (myTexture != null)
{
actionResult(myTexture);
}
}
}
public string StreamingAssetsPath(string pathName)
{
string path = "";
if (Application.platform == RuntimePlatform.WindowsEditor || Application.platform == RuntimePlatform.OSXEditor || Application.platform == RuntimePlatform.IPhonePlayer)
{
path = "file://" + Application.streamingAssetsPath + "/" + pathName;
}
else if (Application.platform == RuntimePlatform.Android)
{
path = Application.streamingAssetsPath + "/" + pathName;
}
return path;
}
}