如何解决如何从引用库的项目中获取变量?
假设我有一个
public struct Level
{
public Level(int _Id)
{
Id = _Id;
}
public int Id { get; }
public void NextLevel()
{
}
}
在引用的库中, 这:
static void Main(string[] args)
{
Level Lvl1 = new Level(0);
Level Lvl2 = new Level(1);
Level Lvl3 = new Level(2);
//some code..
//some code..
//some finish code..
Level.NextLevel();
}
在引用dll库的项目中。
现在,我希望库中的NextLevel()方法通过ID从一个级别更改为另一个级别,即使该变量不存在于库中,而是存在于项目中。
比方说,玩家完成了第1级操作,该方法正在被调用。 该方法应通过ID获得2级,如果该级别不存在,则应引发一个自定义异常。
注意:我没有使用unity或任何其他C#游戏引擎。我正在制造自己的引擎。
解决方法
如果不提供,则无法神奇地访问类的局部作用域变量。
您可以执行以下操作:
struct ContentView: View {
@State var result = 0
var body: some View {
VStack {
Text("\(result)")
.font(.largeTitle)
.frame(height: 100)
.padding()
Spacer()
Button(action: {
self.result += 1
},label: {
Text("Add one")
.font(.title)
.padding()
})
Button(action: {
self.result -= 1
},label: {
Text("Minus one")
.font(.title)
.padding()
})
}
}
}
然后
public class Level
{
public Level(int _Id)
{
Id = _Id;
}
public int Id { get; }
public Level NextLevel { get; set; }
}
如果您不让Level结构获得引用,那么它将无法得知。
另一种可行的方法是使用持久性(数据库,文件等)并从那里共享数据。
您可以使用类似Reading all process memory to find address of a string variable c#的方法搜索整个过程存储器,但不建议这样做,因为它不符合OOP并可能导致意外问题(例如使用将从GC中选择的未引用变量)从而弄乱了托管代码。
,如果我正确理解了这一点,则需要包含您的Level类的动态链接库(DLL)。然后,您想从游戏项目中访问该类。为此,您需要创建您的库项目并编译DLL文件。然后添加该DLL文件作为对您的游戏项目的引用。然后,您将需要``使用库的名称空间'',即using DLLNamespace;
。这是我将如何处理的示例:
类库项目(DLL)
我创建了一个LevelManager
类,其中包含List<Level>
个可用级别。 LevelManager
实例可以通过调用CreateLevel()
方法来添加新级别。然后,您可以访问游戏项目中的当前级别,下一级别和可用级别。我还添加了一个名为WhatIsNextLevel
的属性,如果您出于某种原因需要该属性,则无需加载它就可以检索下一个级别。
您也可以使用Dictionary<int,Level>
代替List<Level>
,并使用密钥作为关卡的ID。
using System.Collections.Generic;
using System.Linq;
namespace LevelLibrary
{
public class LevelManager
{
public List<Level> Levels { get; set; } = new List<Level>();
public Level CurrentLevel => Levels.Where(l => l.ID == currentLevel).FirstOrDefault();
public Level WhatIsNextLevel => Levels.Where(l => l.ID == currentLevel + 1).FirstOrDefault(); // Get the next level without changing the current level
public int LevelsAvailable => Levels.Count();
private int currentLevel = 0;
public class Level
{
public int ID { get; set; }
public Level(int id)
{
ID = id;
}
}
public Level CreateLevel()
{
Level newLevel = new Level(Levels.Count + 1);
Levels.Add(newLevel);
if (currentLevel == 0) currentLevel = 1;
return newLevel;
}
public Level NextLevel()
{
currentLevel++;
return CurrentLevel;
}
}
}
游戏项目
我已经对您的示例进行了调整,以创建几个级别,然后循环遍历这些级别,直到达到终点为止,这只是为了说明如何使用它。除了在这里有一个循环来创建多个级别之外,您还可以在您的库中创建一个CreateLevels(int numLevels)
方法,并在其中创建循环,以便可以在其他位置重复使用。
using LevelLibrary; // Use your Class Library (DLL) namespace (Don't forget to add it as a reference)
namespace Game
{
class Game
{
static void Main(string[] args)
{
LevelManager levelManager = new LevelManager();
// Create some example levels
for (int i = 0; i <= 2; i++)
{
levelManager.CreateLevel();
}
Console.WriteLine($"Starting on level {levelManager.CurrentLevel.ID.ToString()}");
// Loop through more levels than we have just to show an example
// of how you can change to the next level and handle null
for (int i = 0; i <= 3; i++)
{
levelManager.NextLevel();
//some code..
//some code..
//some finish code..
if (levelManager.CurrentLevel == null)
{
Console.WriteLine("There are no more levels");
}
else
{
Console.WriteLine($"Level is now {levelManager.CurrentLevel.ID.ToString()}");
}
}
Console.ReadLine(); // Keep the window open so you can see the output
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。