Some thoughts on learning xlua by yourself

For example
, first create a new LuaMgr empty object in the scene
and then hang a script using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using XLua;
using System.IO;

public class HotFixScript : MonoBehaviour
{
private LuaEnv lua;
// Start is called before the first frame update
void Awake()
{
lua = new LuaEnv();
lua.AddLoader(MyLoader);
lua.DoString(@“require ‘game’”);
}

private byte[] MyLoader(ref string fileluaname)
{
    string absPath = Application.dataPath+@"\LuaText\" + fileluaname + ".lua";
    Debug.Log("abspath"+absPath);

    return System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(absPath));
}
// Update is called once per frame
private void OnDestroy()
{
    lua.Dispose();
}

private void OnDisable()
{
    lua.DoString(@"require 'gameDispose'");
}

}
The game.lua and gameDispose.lua scripts are as follows

 GameObject=CS.UnityEngine.GameObject
 Input=CS.UnityEngine.Input

 PlayerMove=CS.PlayerMove
 Vector3 =CS.UnityEngine.Vector3
 Time=CS.UnityEngine.Time

 Quaternion=CS.UnityEngine.Quaternion
 Destroy=CS.UnityEngine.GameObject.Destroy


--LUA实现人物移动
xlua.private_accessible(PlayerMove)

xlua.hotfix(PlayerMove,'Update',function(self)
         -- local moveSpeed= self.moveSpeed
          --local rotateSpeed=self.rotateSpeed
        -- print('Time'..Time.deltaTime)
       --  print('moveSpeed'..':'..self.moveSpeed)
       --  print('rotateSpeed'..':'..self.rotateSpeed)
       --  print('vinput'..self.vInput)
        -- print('hInput'..self.hInput)
        
     
         self.vInput=Input.GetAxis('Vertical') * (self.moveSpeed)
         self.hInput=Input.GetAxis('Horizontal') * (self.rotateSpeed)
     
         --self.transform:Translate(Vector3.forward * self.moveSpeed * self.vInput * Time.deltaTime)
        -- self.transform:Rotate(Vector3.up * self.hInput * self.rotateSpeed * Time.deltaTime)
end)

xlua.hotfix(PlayerMove,'Start',function (self)

    self.Rigidbody=self.transform:GetComponent('Rigidbody')
    
end)

xlua.hotfix(PlayerMove,'FixedUpdate',function (self)
    
    local rotation=Vector3.up*self.hInput

    local angleRot=Quaternion.Euler(rotation* Time.fixedDeltaTime)

    self.Rigidbody:MovePosition(self.transform.position+self.transform.forward*self.vInput* Time.fixedDeltaTime)

    self.Rigidbody:MoveRotation(self.Rigidbody.rotation*angleRot);

end)


--实现人物摄像机跟随
CameraMove=CS.CameraMove

xlua.private_accessible(CameraMove)
xlua.hotfix(CameraMove,'Start',function (self)

    self.camoffset=Vector3(0,1.2,-2.6)
   
    self.target=GameObject.Find('Player').transform
    
    print("cam开始执行")

    
end)

xlua.hotfix(CameraMove,'LateUpdate',function (self)

    self.transform.position=self.target.TransformPoint(self.target,self.camoffset)

    self.transform:LookAt(self.target)
    
end)

--物体被捡起来的脚本
ItemScript=CS.ItemScript
xlua.private_accessible(ItemScript)
xlua.hotfix(ItemScript,'OnCollisionEnter',function (self,collision)
    
    print("hello")
    if collision.gameObject.name=='Player' then
        Destroy(self.gameObject)
        print('luaItemPicked')
    end

end)

--敌人发现自己的脚本
EnemyScript=CS.EnemyScript
xlua.private_accessible(EnemyScript)
xlua.hotfix(EnemyScript,'OnTriggerEnter',function(self, collider)
       if collider.name=='Player' then
           print("lua敌人发现了自己")
       end
end)
xlua.hotfix(EnemyScript,'OnTriggerExit',function(self,collider)
       if collider.name=='Player' then
           print("lua我已经走出敌人范围之外了")
       end
end)


The gameDispose.lua script is as follows

PlayerMove=CS.PlayerMove
xlua.hotfix(PlayerMove,'Update',nil)
xlua.hotfix(PlayerMove,'Start',nil)
xlua.hotfix(PlayerMove,'FixedUpdate',nil)
CameraMove=CS.CameraMove
xlua.hotfix(CameraMove,'Start',nil)
xlua.hotfix(CameraMove,'LateUpdate',nil)
ItemScript=CS.ItemScript
xlua.hotfix(ItemScript,'OnCollisionEnter',nil)
EnemyScript=CS.EnemyScript
xlua.hotfix(EnemyScript,'OnTriggerEnter',nil)
xlua.hotfix(EnemyScript,'OnTriggerExit',nil)


Then the corresponding PlayerMove, CameraMove, and ItemScript above correspond to scripts that inherit mono respectively.
insert image description here
In fact, lua is not very difficult. The most important thing is to make good use of the difference between table and metatable. The difference between and:

Guess you like

Origin blog.csdn.net/charlsdm/article/details/122999659