Unity combine le framework SLua pour utiliser essentiellement Demo

Installation du cadre SLua

1. Téléchargez la dernière version depuis https://github.com/pangweiwei/slua/wiki et copiez tout le contenu du répertoire Assets dans le projet. Pour le produit final, vous pouvez supprimer des exemples, des documents et d'autres contenus. Si cela est en phase de développement, cela n’a pas d’importance.

2. Attendez que l'unité soit compilée. Si tout se passe bien, le menu SLua apparaîtra. Cliquez sur la commande All->Make dans le menu SLua pour générer manuellement le fichier d'interface U3d pour la version actuelle.

3. Chaque fois que vous mettez à jour la version SLua, n'oubliez pas All->Clear, puis All->Make, sinon il risque de ne pas fonctionner correctement.

Effet:
Insérer la description de l'image ici

Le code C# est le suivant :

using UnityEngine;
using System.IO;
using SLua;
using UnityEngine.UI;




//public delegate byte[] LuaReourcesFileLoader(string fn, ref string absoluteFn);
public class LoadLua : MonoBehaviour
{
    
       

    LuaSvr svr;
    LuaTable self;
    LuaFunction update;

    [CustomLuaClass]
    public delegate void UpdateDelegate(object self);
    UpdateDelegate ud;
   
    void Start()
    {
    
    
       
        svr = new LuaSvr();
        LuaSvr.mainState.loaderDelegate += LuaFileLoader;
        svr.init(null, () => // 如果不用init方法初始化的话,在Lua中是不能import的
        {
    
       
            
            // 这里为了测试就不先判断为空,开发的时候再加上
            self = (LuaTable)svr.start( Application.streamingAssetsPath + "/Lua/SLuaTest.txt");

            update = (LuaFunction)self["update"];
            ud = update.cast<UpdateDelegate>();
            
          
        });
        
    }
    //public float i=0.01f;
    //public Color color_ = new Color(0, 1, 1);
    void Update()
    {
    
        
        //RGB颜色渐变效果
        //Color(0,1,1)
        //-G +R -B +G -R +B
        //if (color_.r == 0 && color_.g > 0 && color_.b == 1)
        //{
    
    
        //    color_.g -= i;
        //    if (color_.g<0) {
    
    
        //        color_.g = 0;
        //    }
        //}
        //else if (color_.g == 0 && color_.r < 1 && color_.b == 1)
        //{
    
    
        //    color_.r += i;
        //    if (color_.r > 1)
        //    {
    
    
        //        color_.r = 1;
        //    }
        //}
        //else if (color_.r == 1 && color_.g == 0 && color_.b > 0)
        //{
    
    
        //    color_.b -= i;
        //    if (color_.b < 0)
        //    {
    
    
        //        color_.b = 0;
        //    }
        //}
        //else if (color_.b == 0 && color_.r == 1 && color_.g < 1)
        //{
    
    
        //    color_.g += i;
        //    if (color_.g > 1)
        //    {
    
    
        //        color_.g = 1;
        //    }
        //}
        //else if (color_.r > 0 && color_.g == 1 && color_.b == 0)
        //{
    
    
        //    color_.r -= i;
        //    if (color_.r < 0)
        //    {
    
    
        //        color_.r = 0;
        //    }
        //}
        //else if (color_.r == 0 && color_.g == 1 && color_.b < 1)
        //{
    
    
        //    color_.b += i;
        //    if (color_.b > 1)
        //    {
    
    
        //        color_.b = 1;
        //    }
        //}
     
        //A.transform.GetComponent<Renderer>().material.color = color_;
        if (ud != null) ud(self);
    }

    private static byte[] LuaFileLoader(string strFile, ref string fn)
    {
    
    
        
        string filename =  strFile;
        return File.ReadAllBytes(filename);
    }
    public  Sprite ResourcesSprite(string path)
    {
    
    

        return Resources.Load<Sprite>(path);
    }
}
   


Le code Lua est le suivant :

--lua代码文件名称:SLuaTest.txt
import "UnityEngine"
import "UnityEngine.UI"


local class={
    
    }
IsRunning=true;

function main()  --程序启动自动调用该方法 类似Unity中的Start方法
   cs = GameObject.Find("LoadLuaManager") --Lua调用CS代码
   


   camera=Camera.main
   camera.clearFlags = CameraClearFlags.SolidColor
   camera.backgroundColor = Color.black
   print("Lua创建了一个Cube")
   cube = GameObject.CreatePrimitive(PrimitiveType.Cube)
   cube:AddComponent(UnityEngine.AudioSource).clip=Resources.Load("One Last Kiss(Instrumental)")
   cube.transform:GetComponent(AudioSource).loop = true
   cube.transform:GetComponent(AudioSource):Play()
   --cube.transform:GetComponent(Renderer).material=Resources.Load("Material") 从Resources获取材质球的方法
   cube.transform:GetComponent(Renderer).material.color=Color.red; --直接设置材质的颜色
   cube.transform.localPosition =Vector3(0, 1, -5)
   
   MainTransform =  GameObject.Find("Canvas/MainPlant").transform
  
   GameObject.Instantiate(Resources.Load("Button"),Vector3(960, 1000, 0),Quaternion.identity,MainTransform).name="Button1" 
   But=GameObject.Find("Canvas/MainPlant/Button1")
   But.transform.localScale= Vector3(2, 2, 2);

   GameObject.Find("Canvas/MainPlant/Button1/Text"):GetComponent(UI.Text).text="切换画面填充模式"
 
   GameObject.Instantiate(Resources.Load("Button"),Vector3(1250, 1000, 0),Quaternion.identity,MainTransform).name="Button2" 
   But2=GameObject.Find("Canvas/MainPlant/Button2")
   But2.transform.localScale= Vector3(1.5, 1.5, 1.5);

   GameObject.Find("Canvas/MainPlant/Button2/Text"):GetComponent(UI.Text).text="切换颜色"


   GameObject.Instantiate(Resources.Load("Button"),Vector3(360, 700, 0),Quaternion.identity,MainTransform).name="Button3" 
   But3=GameObject.Find("Canvas/MainPlant/Button3")
   But3.transform.localScale= Vector3(2, 2, 2);
   GameObject.Destroy( GameObject.Find("Canvas/MainPlant/Button3/Text"))   --在Lua中如何删除物体
   But3:GetComponent(RectTransform).sizeDelta=Vector2(60,60);
    
  
   But3:GetComponent(UI.Image).sprite= cs:GetComponent("LoadLua"):ResourcesSprite("播放")
 
  But:GetComponent(Button).onClick:AddListener(function ()
      print("Lua中的Button监听事件触发");
      if( camera.clearFlags==CameraClearFlags.SolidColor)
      then
             But2.transform.localScale= Vector3(1.5, 1.5, 1.5);
            camera.clearFlags =CameraClearFlags.Skybox
            
      elseif(camera.clearFlags==CameraClearFlags.Skybox)
      then
           But2.transform.localScale= Vector3(0,0,0);
          camera.clearFlags =CameraClearFlags.Nothing
        
      elseif(camera.clearFlags==CameraClearFlags.Nothing)
      then
           But2.transform.localScale= Vector3(0,0,0);
          camera.clearFlags =CameraClearFlags.Depth
        
      elseif(camera.clearFlags==CameraClearFlags.Depth)
      then
           But2.transform.localScale= Vector3(1.5, 1.5, 1.5);
          camera.clearFlags=CameraClearFlags.SolidColor
        
      end

   end);

   But2:GetComponent(Button).onClick:AddListener(function ()
        if(camera.backgroundColor == Color.black)
        then
            camera.backgroundColor =Color.white
        elseif(camera.backgroundColor==Color.white)
        then
            camera.backgroundColor = Color.blue
        elseif(camera.backgroundColor==Color.blue)
        then
            camera.backgroundColor = Color.red
        elseif(camera.backgroundColor==Color.red)
        then
            camera.backgroundColor = Color.green
        elseif(camera.backgroundColor==Color.green)
        then
            camera.backgroundColor =Color(1,1,0)
        elseif(camera.backgroundColor==Color(1,1,0))
        then
            camera.backgroundColor = Color.clear
        elseif(camera.backgroundColor==Color.clear)
        then 
            camera.backgroundColor = Color.cyan
        elseif(camera.backgroundColor==Color.cyan)
        then
            camera.backgroundColor = Color(0.5,0.5,0.5)
        elseif(camera.backgroundColor==Color(0.5,0.5,0.5))
        then
            camera.backgroundColor = Color.magenta
        elseif(camera.backgroundColor==Color.magenta)
        then
            camera.backgroundColor = Color.black
        end
        --Color.white  Color.clear  Color.cyan Color.red Color.green Color.gray Color.grey Color.magenta Color.yellow
   end);

   But3:GetComponent(Button).onClick:AddListener(function ()
     if(cube.transform:GetComponent(AudioSource).isPlaying)
     then             
           cube.transform:GetComponent(AudioSource):Pause()
            But3:GetComponent(UI.Image).sprite= cs:GetComponent("LoadLua"):ResourcesSprite("暂停")
            IsRunning=false
     else
           cube.transform:GetComponent(AudioSource):Play()    
             But3:GetComponent(UI.Image).sprite= cs:GetComponent("LoadLua"):ResourcesSprite("播放")
            IsRunning=true
     end
     end);


   Text =  GameObject.Instantiate(Resources.Load("Text"),Vector3(1600, 650, 0),Quaternion.identity,MainTransform)
   Text:GetComponent(UI.Text).color = Color.white;
   Text:GetComponent(UI.Text).fontSize = 35;
 
   Text:GetComponent(RectTransform).sizeDelta=Vector2(600,300);
	


   Text1 =  GameObject.Instantiate(Resources.Load("Text"),Vector3(1600, 450, 0),Quaternion.identity,MainTransform)
   Text1:GetComponent(UI.Text).color = Color.white;
   Text1:GetComponent(UI.Text).fontSize = 35;
   Text1:GetComponent(RectTransform).sizeDelta=Vector2(600,300);


   Text2 =  GameObject.Instantiate(Resources.Load("Text"),Vector3(1600, 250, 0),Quaternion.identity,MainTransform)
   Text2:GetComponent(UI.Text).color = Color.white;
   Text2:GetComponent(UI.Text).fontSize = 35;
   Text2:GetComponent(RectTransform).sizeDelta=Vector2(600,300);


   Text3 =  GameObject.Instantiate(Resources.Load("Text"),Vector3(600, 800, 0),Quaternion.identity,MainTransform)
   Text3:GetComponent(UI.Text).color = Color.white;
   Text3:GetComponent(UI.Text).fontSize = 35;
   Text3:GetComponent(RectTransform).sizeDelta=Vector2(600,100);


   Slider_= GameObject.Instantiate(Resources.Load("Slider"),Vector3(960, 100, 0),Quaternion.identity,MainTransform)
   Slider_.transform.localScale= Vector3(2, 2, 2);
   Slider_:GetComponent(UI.Slider).value=1;
   Slider_:GetComponent(UI.Slider).onValueChanged:AddListener(
		function(v)
		    cube.transform.localScale= Vector3(v, v, v);
            cube.transform:GetComponent(AudioSource).volume=v
		end
	)




    
    --if you want to use update function,you need return class
	--如果你想去使用Update函数,你需要在main方法返回class
	return class
 

end
ColorTimeSpeed=0.001
color_ =Color(0,1,1)
minute_=60
function  class:update() --Lua中使用update 需要继承在Main 返回的Class
  --print("Lua Update 正在执行...")
 if (IsRunning)
  then
  cube.transform.localRotation= Quaternion.Euler(45,45,math.sin(Time.time)*180)

    if (color_.r == 0 and color_.g > 0 and color_.b == 1)
    then
            color_.g =color_.g - ColorTimeSpeed
            if (color_.g<0)
            then
                color_.g = 0
            end

    elseif (color_.g == 0 and color_.r < 1 and color_.b == 1)
    then
            color_.r =color_.r + ColorTimeSpeed
            if (color_.r > 1)
            then
                color_.r = 1
            end

    elseif (color_.r == 1 and color_.g == 0 and color_.b > 0)
    then
            color_.b =color_.b - ColorTimeSpeed
            if (color_.b < 0)
            then
                color_.b = 0
            end

    elseif (color_.b == 0 and color_.r == 1 and color_.g < 1)
    then
            color_.g =color_.g + ColorTimeSpeed
            if (color_.g > 1)
            then
                color_.g = 1
            end

    elseif (color_.r > 0 and color_.g == 1 and color_.b == 0)
    then
            color_.r = color_.r - ColorTimeSpeed
            if (color_.r < 0)
            then
                color_.r = 0
            end

    elseif (color_.r == 0 and color_.g == 1 and color_.b < 1)
    then
            color_.b =color_.b + ColorTimeSpeed
            if (color_.b > 1)
            then
                color_.b = 1
            end
    end
	 
      cube.transform:GetComponent(Renderer).material.color= color_
      Text:GetComponent(UI.Text).text= "<color=red>COLOR:</color>\nR:"..color_.r.."\nG:"..color_.g.."\nB:"..color_.b
      Text1:GetComponent(UI.Text).text= "<color=red>ROTATION:</color>\nx:"..cube.transform.localRotation.x.."\ny:"..cube.transform.localRotation.y.."\nz:"..cube.transform.localRotation.z
      Text2:GetComponent(UI.Text).text= "<color=red>SCALE:</color>\nx:"..cube.transform.localScale.x.."\ny:"..cube.transform.localScale.y.."\nz:"..cube.transform.localScale.z
  
     if(cube.transform:GetComponent(AudioSource).isPlaying)
     then
        Text3:GetComponent(UI.Text).text="<color=red>MUSIC TIME:</color>\n"..cube.transform:GetComponent(AudioSource).time / minute_.."/"..cube.transform:GetComponent(AudioSource).clip.length / minute_
     
     end

  
  
  
  
  end
end

Je suppose que tu aimes

Origine blog.csdn.net/LCF_CSharp/article/details/131440403
conseillé
Classement