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.
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: