C# 在游戏运行时,如何检查变量值是否更改?
在脚本的顶部,我添加了变量_birdscont:C# 在游戏运行时,如何检查变量值是否更改?,c#,unity3d,C#,Unity3d,在脚本的顶部,我添加了变量_birdscont: public int _birdscount; 然后在LoadSettings函数中,我添加了以下行: res.boidSettings [0].BirdsCount = _birdscount; 因此,每次我在Inspector的编辑器中更改_birdscont的值,然后运行游戏时,它就会生效 Settings LoadSettings() { TextAsset temp = (TextAsset)Resources.Load
public int _birdscount;
然后在LoadSettings函数中,我添加了以下行:
res.boidSettings [0].BirdsCount = _birdscount;
因此,每次我在Inspector的编辑器中更改_birdscont的值,然后运行游戏时,它就会生效
Settings LoadSettings()
{
TextAsset temp = (TextAsset)Resources.Load(SettingsFileName);
var str = new StringReader(temp.text);
Resources.UnloadAsset(temp);
res = (Settings)serializer.Deserialize(str);
while( res.boidSettings.Count < instancePoints.Length )
res.boidSettings.Add(new BoidSettingsEx());
res.boidSettings [0].BirdsCount = _birdscount;
return res;
}
这是不够的或是不对的
void Update()
{
if (Input.GetKeyDown ("space"))
OnSettingsClick ();
if (Input.GetKeyDown ("e"))
{
LoadSettings ();
Restart ();
}
//We call it here to be sure that click on button desn't lead to camera target changing
if( !guiTools.MouseOverGUI && Input.GetMouseButtonDown(0) )
cameraControl.CheckForNewTarget( Input.mousePosition );
guiTools.ManualUpdate();
}
如果需要,这是完整的脚本:
using UnityEngine;
using System.Xml.Serialization;
using System.IO;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
public class Main : MonoBehaviour
{
public CameraControl cameraControl;
public Object birdPrefab;
public Transform birdParent;
private Transform cameraObj;
public Transform[] instancePoints;
public int _birdscount;
private Settings res;
[System.Serializable]
public class BoidSettingsEx: Boid.Settings
{
public float BirdsCount = 100;
}
[System.Serializable]
public struct Size
{
public int width;
public int height;
public Size( int width, int height )
{
this.width = width;
this.height = height;
}
public bool IsValid { get{ return width > 0 && height > 0; } }
}
[System.Serializable]
public class Settings
{
public List<BoidSettingsEx> boidSettings = new List<BoidSettingsEx>();
public int instancePointNum = 0;
public Boid.DebugSettings debugSettings = new Boid.DebugSettings();
[System.Xml.Serialization.XmlIgnore]
public bool showSettingsWindow = false;
[System.Xml.Serialization.XmlIgnore]
public int settingsWindowTab = 0;
[System.Xml.Serialization.XmlIgnore]
public Size screenSize = new Size();
}
[SerializeField]
private Settings settings = new Settings();
//static is used to keep values after restart
static private Settings globalSettings;
void Start()
{
if( globalSettings == null )
{
settings = LoadSettings();
globalSettings = settings;
}
else
settings = globalSettings;
InstantiateBirds();
cameraControl.Enabled = !settings.showSettingsWindow;
}
void InstantiateBirds()
{
var ip = instancePoints[settings.instancePointNum];
var sts = settings.boidSettings[settings.instancePointNum];
sts.Trace = ip.GetComponent<Trace>();
const float size = 0.1f;
cameraObj = InstantiateBird( ip.position, ip.rotation, sts ).transform;
cameraControl.Target = cameraObj;
MathTools.FillSquareUniform( sts.BirdsCount, delegate ( int x, int y )
{
if( x != 0 || y != 0 )
InstantiateBird(
cameraObj.position + new Vector3( size * x, size * y, Random.Range(-size, size) ),
MathTools.RandomYawPitchRotation(),
sts
);
});
}
private readonly XmlSerializer serializer = new XmlSerializer(typeof(Settings));
private string SettingsFileName { get{ return "Settings"; } }
private string SettingsFilePath { get{ return Application.dataPath + Path.DirectorySeparatorChar + "Resources" + Path.DirectorySeparatorChar + SettingsFileName + ".xml";} }
Settings LoadSettings()
{
TextAsset temp = (TextAsset)Resources.Load(SettingsFileName);
var str = new StringReader(temp.text);
Resources.UnloadAsset(temp);
res = (Settings)serializer.Deserialize(str);
while( res.boidSettings.Count < instancePoints.Length )
res.boidSettings.Add(new BoidSettingsEx());
res.boidSettings [0].BirdsCount = _birdscount;
return res;
}
void SaveSettings()
{
if (Application.isEditor) {
using (var str = new FileStream (SettingsFilePath, FileMode.Create))
serializer.Serialize (str, settings);
}
}
private GameObject InstantiateBird( Vector3 position, Quaternion rotation, Boid.Settings boidSettings )
{
var obj = (GameObject)Instantiate( birdPrefab, position, rotation );
var boid = obj.GetComponent<Boid>();
obj.transform.parent = birdParent;
boid.SettingsRef = boidSettings;
boid.DebugSettingsRef = settings.debugSettings;
return obj;
}
public static Boid.Settings GetSettings( GameObject obj )
{
var main = Camera.main.GetComponent<Main>();
return main.settings.boidSettings[main.settings.instancePointNum];
}
private GuiTools guiTools = new GuiTools();
void GuiBoidSettings()
{
var sts = settings.boidSettings[settings.instancePointNum];
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
var newInstancePointNum = guiTools.Switcher( settings.instancePointNum, "Instance point", new string[]{ "WayPoints", "Box", "Freedom" } );
guiTools.FloatParam( ref sts.SpeedMultipliyer, "Speed", 20 );
guiTools.FloatParam( ref sts.ViewRadius, "Bird's view distance", 20 );
guiTools.FloatParam( ref sts.OptDistance, "Optimal distance between birds", 2 );
guiTools.FloatParam( ref sts.AligmentForcePart, "Fraction of flock aligment force", 0.01f );
GUILayout.EndVertical();
GUILayout.BeginVertical();
guiTools.FloatParam( ref sts.BirdsCount, "Number of birds (Restart Required)", 1000);
guiTools.FloatParam( ref sts.TotalForceMultipliyer, "Reaction speed", 50 );
guiTools.FloatParam( ref sts.Inertness, "Inertness", 1 );
guiTools.FloatParam( ref sts.VerticalPriority, "Flock's shape deformation", 3 );
guiTools.FloatParam( ref sts.AttractrionForce, "Waypoint's attraction force", 1.0f );
GUILayout.EndVertical();
GUILayout.EndHorizontal();
if( GUILayout.Button("Load default parameters") )
{
var defSt = LoadSettings();
settings.boidSettings[settings.instancePointNum] = defSt.boidSettings[settings.instancePointNum];
Restart();
}
if( newInstancePointNum != settings.instancePointNum )
{
settings.instancePointNum = newInstancePointNum;
cameraControl.ResetStoredSettings();
Restart();
}
}
void GuiDebugDrawSettings()
{
GUILayout.BeginVertical("box");
var newFullScreen = GUILayout.Toggle( Screen.fullScreen, "Fullscreen" );
GUILayout.EndVertical();
if( newFullScreen != Screen.fullScreen )
if( newFullScreen)
{
settings.screenSize = new Size( Screen.width, Screen.height );
Screen.SetResolution( Screen.currentResolution.width, Screen.currentResolution.height, true );
}
else if( settings.screenSize.IsValid )
Screen.SetResolution( settings.screenSize.width, settings.screenSize.height, false );
else
Screen.fullScreen = false;
GUILayout.BeginVertical("box");
guiTools.Toggle( ref settings.debugSettings.enableDrawing, "Algorithm Explanation Vectors" );
GUILayout.EndVertical();
if( settings.debugSettings.enableDrawing )
{
GUILayout.BeginVertical("box");
guiTools.Toggle( ref settings.debugSettings.velocityDraw, "Resulting velocity" );
guiTools.Toggle( ref settings.debugSettings.cohesionForceDraw, "Cohesion force" );
guiTools.Toggle( ref settings.debugSettings.collisionsAvoidanceForceDraw, "Collision Avoidance force" );
guiTools.Toggle( ref settings.debugSettings.positionForceDraw, "Cohesion + Collision Avoidance forces" );
guiTools.Toggle( ref settings.debugSettings.obstaclesAvoidanceDraw, "Obstacles Avoidance forces" );
guiTools.Toggle( ref settings.debugSettings.alignmentForceDraw, "Aligment force" );
guiTools.Toggle( ref settings.debugSettings.attractionForceDraw, "Attraction force" );
guiTools.Toggle( ref settings.debugSettings.totalForceDraw, "Resulting force" );
GUILayout.EndVertical();
}
}
void GuiInfo()
{
var text =
"<b><color=yellow>Bird Flocking Simulation</color></b>\n" +
" \n" +
" <b><color=orange>Dmitry Shesterkin 2013</color></b>\n" +
" http://black-square.github.io/BirdFlock/\n" +
" dfb@yandex.ru\n" +
" \n" +
"<b><color=yellow>Controls</color></b>\n" +
" \n" +
" <b><color=orange>Space</color></b> - Toggle settings\n" +
" <b><color=orange>Mouse</color></b> - Camera rotation\n" +
" <b><color=orange>Left Mouse Button Click</color></b> - Attach camera to target\n" +
" <b><color=orange>Tab</color></b> - Detach camera from target\n" +
" <b><color=orange>T</color></b> - Rotate camera with target\n" +
" <b><color=orange>Mouse ScrollWheel / Up / Down</color></b> - Zoom\n" +
" <b><color=orange>W/A/S/D/Q/E</color></b> - Manual camera movement\n" +
" <b><color=orange>Hold Right Mouse Button</color></b> - Disable camera rotation";
GUI.skin.box.richText = true;
GUI.skin.box.wordWrap = false;
GUI.skin.box.alignment = TextAnchor.MiddleLeft;
GUILayout.Box( text );
}
void SettingsWindow( int windowId )
{
GUILayout.BeginVertical();
settings.settingsWindowTab = GUILayout.Toolbar( settings.settingsWindowTab, new string[]{ "Birds Params", "Screen", "Info" } );
switch(settings.settingsWindowTab)
{
case 0:
GuiBoidSettings();
break;
case 1:
GuiDebugDrawSettings();
break;
case 2:
GuiInfo();
break;
}
GUILayout.EndVertical();
}
delegate void SimpleDlg();
void OnSettingsClick()
{
settings.showSettingsWindow = !settings.showSettingsWindow;
if (!settings.showSettingsWindow)
SaveSettings ();
cameraControl.Enabled = !settings.showSettingsWindow;
}
void Restart()
{
guiTools.ClearCache();
//Application.LoadLevel (Application.loadedLevelName);
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void Update()
{
if (Input.GetKeyDown ("space"))
OnSettingsClick ();
if (Input.GetKeyDown ("e"))
{
LoadSettings ();
Restart ();
}
//We call it here to be sure that click on button desn't lead to camera target changing
if( !guiTools.MouseOverGUI && Input.GetMouseButtonDown(0) )
cameraControl.CheckForNewTarget( Input.mousePosition );
guiTools.ManualUpdate();
}
void OnGUI()
{
var tlbLabels = new string[] { "Restart", "Settings" };
var tlbActions = new SimpleDlg[] { Restart, OnSettingsClick };
var tlbResult = GUILayout.Toolbar( -1, tlbLabels );
guiTools.CheckMouseOverForLastControl();
if( tlbResult >= 0 )
tlbActions[tlbResult]();
if( settings.showSettingsWindow )
GUILayout.Window(0, new Rect(10, 30, 2, 2), SettingsWindow, "Settings");
}
}
使用UnityEngine;
使用System.Xml.Serialization;
使用System.IO;
使用System.Collections.Generic;
使用UnityEngine.SceneManagement;
公共课主要内容:单一行为
{
公共摄像机控制摄像机控制;
公共对象birdPrefab;
公共鸟舍;
私有转换cameraObj;
公共转换[]实例点;
公共国际鸟类计数;
私人设置;
[系统可序列化]
公共类BoidSettingsEx:Boid.Settings
{
公众浮标鸟数=100;
}
[系统可序列化]
公共结构大小
{
公共整数宽度;
公众内部高度;
公共大小(整数宽度、整数高度)
{
这个。宽度=宽度;
高度=高度;
}
公共bool有效{get{返回宽度>0&&height>0;}}
}
[系统可序列化]
公共类设置
{
public List boidSettings=新列表();
public int instancePointNum=0;
public Boid.DebugSettings DebugSettings=新建Boid.DebugSettings();
[System.Xml.Serialization.XmlIgnore]
公共bool showSettingsWindow=false;
[System.Xml.Serialization.XmlIgnore]
公共整数设置SwindowTab=0;
[System.Xml.Serialization.XmlIgnore]
公共大小屏幕大小=新大小();
}
[序列化字段]
私人设置=新设置();
//静态用于在重新启动后保留值
静态私有设置全局设置;
void Start()
{
if(globalSettings==null)
{
设置=加载设置();
全局设置=设置;
}
其他的
设置=全局设置;
实例化birds();
cameraControl.Enabled=!settings.showSettingsWindow;
}
void实例化birds()
{
var ip=instancePoints[settings.instancePointNum];
var sts=settings.boidSettings[settings.instancePointNum];
sts.Trace=ip.GetComponent();
常量浮点大小=0.1f;
cameraObj=实例化EBIRD(ip.position,ip.rotation,sts).transform;
cameraControl.Target=cameraObj;
MathTools.FillSquareUniform(sts.BirdsCount,委托(int x,int y)
{
如果(x!=0 | | y!=0)
息税前利润(
cameraObj.position+新矢量3(大小*x,大小*y,随机范围(-size,size)),
MathTools.RandomYawPitchRotation(),
sts
);
});
}
私有只读XmlSerializer serializer=新XmlSerializer(typeof(设置));
私有字符串设置文件名{get{return“Settings”;}
私有字符串设置文件路径{get{return Application.dataPath+Path.directoryseportorchar+“Resources”+Path.directoryseportorchar+SettingsFileName+“.xml”;}}
设置加载设置()
{
TextAsset temp=(TextAsset)Resources.Load(设置文件名);
var str=新的StringReader(临时文本);
资源。卸载(临时);
res=(设置)序列化程序。反序列化(str);
while(res.boidSettings.Countusing UnityEngine;
using System.Xml.Serialization;
using System.IO;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
public class Main : MonoBehaviour
{
public CameraControl cameraControl;
public Object birdPrefab;
public Transform birdParent;
private Transform cameraObj;
public Transform[] instancePoints;
public int _birdscount;
private Settings res;
[System.Serializable]
public class BoidSettingsEx: Boid.Settings
{
public float BirdsCount = 100;
}
[System.Serializable]
public struct Size
{
public int width;
public int height;
public Size( int width, int height )
{
this.width = width;
this.height = height;
}
public bool IsValid { get{ return width > 0 && height > 0; } }
}
[System.Serializable]
public class Settings
{
public List<BoidSettingsEx> boidSettings = new List<BoidSettingsEx>();
public int instancePointNum = 0;
public Boid.DebugSettings debugSettings = new Boid.DebugSettings();
[System.Xml.Serialization.XmlIgnore]
public bool showSettingsWindow = false;
[System.Xml.Serialization.XmlIgnore]
public int settingsWindowTab = 0;
[System.Xml.Serialization.XmlIgnore]
public Size screenSize = new Size();
}
[SerializeField]
private Settings settings = new Settings();
//static is used to keep values after restart
static private Settings globalSettings;
void Start()
{
if( globalSettings == null )
{
settings = LoadSettings();
globalSettings = settings;
}
else
settings = globalSettings;
InstantiateBirds();
cameraControl.Enabled = !settings.showSettingsWindow;
}
void InstantiateBirds()
{
var ip = instancePoints[settings.instancePointNum];
var sts = settings.boidSettings[settings.instancePointNum];
sts.Trace = ip.GetComponent<Trace>();
const float size = 0.1f;
cameraObj = InstantiateBird( ip.position, ip.rotation, sts ).transform;
cameraControl.Target = cameraObj;
MathTools.FillSquareUniform( sts.BirdsCount, delegate ( int x, int y )
{
if( x != 0 || y != 0 )
InstantiateBird(
cameraObj.position + new Vector3( size * x, size * y, Random.Range(-size, size) ),
MathTools.RandomYawPitchRotation(),
sts
);
});
}
private readonly XmlSerializer serializer = new XmlSerializer(typeof(Settings));
private string SettingsFileName { get{ return "Settings"; } }
private string SettingsFilePath { get{ return Application.dataPath + Path.DirectorySeparatorChar + "Resources" + Path.DirectorySeparatorChar + SettingsFileName + ".xml";} }
Settings LoadSettings()
{
TextAsset temp = (TextAsset)Resources.Load(SettingsFileName);
var str = new StringReader(temp.text);
Resources.UnloadAsset(temp);
res = (Settings)serializer.Deserialize(str);
while( res.boidSettings.Count < instancePoints.Length )
res.boidSettings.Add(new BoidSettingsEx());
res.boidSettings [0].BirdsCount = _birdscount;
return res;
}
void SaveSettings()
{
if (Application.isEditor) {
using (var str = new FileStream (SettingsFilePath, FileMode.Create))
serializer.Serialize (str, settings);
}
}
private GameObject InstantiateBird( Vector3 position, Quaternion rotation, Boid.Settings boidSettings )
{
var obj = (GameObject)Instantiate( birdPrefab, position, rotation );
var boid = obj.GetComponent<Boid>();
obj.transform.parent = birdParent;
boid.SettingsRef = boidSettings;
boid.DebugSettingsRef = settings.debugSettings;
return obj;
}
public static Boid.Settings GetSettings( GameObject obj )
{
var main = Camera.main.GetComponent<Main>();
return main.settings.boidSettings[main.settings.instancePointNum];
}
private GuiTools guiTools = new GuiTools();
void GuiBoidSettings()
{
var sts = settings.boidSettings[settings.instancePointNum];
GUILayout.BeginHorizontal();
GUILayout.BeginVertical();
var newInstancePointNum = guiTools.Switcher( settings.instancePointNum, "Instance point", new string[]{ "WayPoints", "Box", "Freedom" } );
guiTools.FloatParam( ref sts.SpeedMultipliyer, "Speed", 20 );
guiTools.FloatParam( ref sts.ViewRadius, "Bird's view distance", 20 );
guiTools.FloatParam( ref sts.OptDistance, "Optimal distance between birds", 2 );
guiTools.FloatParam( ref sts.AligmentForcePart, "Fraction of flock aligment force", 0.01f );
GUILayout.EndVertical();
GUILayout.BeginVertical();
guiTools.FloatParam( ref sts.BirdsCount, "Number of birds (Restart Required)", 1000);
guiTools.FloatParam( ref sts.TotalForceMultipliyer, "Reaction speed", 50 );
guiTools.FloatParam( ref sts.Inertness, "Inertness", 1 );
guiTools.FloatParam( ref sts.VerticalPriority, "Flock's shape deformation", 3 );
guiTools.FloatParam( ref sts.AttractrionForce, "Waypoint's attraction force", 1.0f );
GUILayout.EndVertical();
GUILayout.EndHorizontal();
if( GUILayout.Button("Load default parameters") )
{
var defSt = LoadSettings();
settings.boidSettings[settings.instancePointNum] = defSt.boidSettings[settings.instancePointNum];
Restart();
}
if( newInstancePointNum != settings.instancePointNum )
{
settings.instancePointNum = newInstancePointNum;
cameraControl.ResetStoredSettings();
Restart();
}
}
void GuiDebugDrawSettings()
{
GUILayout.BeginVertical("box");
var newFullScreen = GUILayout.Toggle( Screen.fullScreen, "Fullscreen" );
GUILayout.EndVertical();
if( newFullScreen != Screen.fullScreen )
if( newFullScreen)
{
settings.screenSize = new Size( Screen.width, Screen.height );
Screen.SetResolution( Screen.currentResolution.width, Screen.currentResolution.height, true );
}
else if( settings.screenSize.IsValid )
Screen.SetResolution( settings.screenSize.width, settings.screenSize.height, false );
else
Screen.fullScreen = false;
GUILayout.BeginVertical("box");
guiTools.Toggle( ref settings.debugSettings.enableDrawing, "Algorithm Explanation Vectors" );
GUILayout.EndVertical();
if( settings.debugSettings.enableDrawing )
{
GUILayout.BeginVertical("box");
guiTools.Toggle( ref settings.debugSettings.velocityDraw, "Resulting velocity" );
guiTools.Toggle( ref settings.debugSettings.cohesionForceDraw, "Cohesion force" );
guiTools.Toggle( ref settings.debugSettings.collisionsAvoidanceForceDraw, "Collision Avoidance force" );
guiTools.Toggle( ref settings.debugSettings.positionForceDraw, "Cohesion + Collision Avoidance forces" );
guiTools.Toggle( ref settings.debugSettings.obstaclesAvoidanceDraw, "Obstacles Avoidance forces" );
guiTools.Toggle( ref settings.debugSettings.alignmentForceDraw, "Aligment force" );
guiTools.Toggle( ref settings.debugSettings.attractionForceDraw, "Attraction force" );
guiTools.Toggle( ref settings.debugSettings.totalForceDraw, "Resulting force" );
GUILayout.EndVertical();
}
}
void GuiInfo()
{
var text =
"<b><color=yellow>Bird Flocking Simulation</color></b>\n" +
" \n" +
" <b><color=orange>Dmitry Shesterkin 2013</color></b>\n" +
" http://black-square.github.io/BirdFlock/\n" +
" dfb@yandex.ru\n" +
" \n" +
"<b><color=yellow>Controls</color></b>\n" +
" \n" +
" <b><color=orange>Space</color></b> - Toggle settings\n" +
" <b><color=orange>Mouse</color></b> - Camera rotation\n" +
" <b><color=orange>Left Mouse Button Click</color></b> - Attach camera to target\n" +
" <b><color=orange>Tab</color></b> - Detach camera from target\n" +
" <b><color=orange>T</color></b> - Rotate camera with target\n" +
" <b><color=orange>Mouse ScrollWheel / Up / Down</color></b> - Zoom\n" +
" <b><color=orange>W/A/S/D/Q/E</color></b> - Manual camera movement\n" +
" <b><color=orange>Hold Right Mouse Button</color></b> - Disable camera rotation";
GUI.skin.box.richText = true;
GUI.skin.box.wordWrap = false;
GUI.skin.box.alignment = TextAnchor.MiddleLeft;
GUILayout.Box( text );
}
void SettingsWindow( int windowId )
{
GUILayout.BeginVertical();
settings.settingsWindowTab = GUILayout.Toolbar( settings.settingsWindowTab, new string[]{ "Birds Params", "Screen", "Info" } );
switch(settings.settingsWindowTab)
{
case 0:
GuiBoidSettings();
break;
case 1:
GuiDebugDrawSettings();
break;
case 2:
GuiInfo();
break;
}
GUILayout.EndVertical();
}
delegate void SimpleDlg();
void OnSettingsClick()
{
settings.showSettingsWindow = !settings.showSettingsWindow;
if (!settings.showSettingsWindow)
SaveSettings ();
cameraControl.Enabled = !settings.showSettingsWindow;
}
void Restart()
{
guiTools.ClearCache();
//Application.LoadLevel (Application.loadedLevelName);
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
void Update()
{
if (Input.GetKeyDown ("space"))
OnSettingsClick ();
if (Input.GetKeyDown ("e"))
{
LoadSettings ();
Restart ();
}
//We call it here to be sure that click on button desn't lead to camera target changing
if( !guiTools.MouseOverGUI && Input.GetMouseButtonDown(0) )
cameraControl.CheckForNewTarget( Input.mousePosition );
guiTools.ManualUpdate();
}
void OnGUI()
{
var tlbLabels = new string[] { "Restart", "Settings" };
var tlbActions = new SimpleDlg[] { Restart, OnSettingsClick };
var tlbResult = GUILayout.Toolbar( -1, tlbLabels );
guiTools.CheckMouseOverForLastControl();
if( tlbResult >= 0 )
tlbActions[tlbResult]();
if( settings.showSettingsWindow )
GUILayout.Window(0, new Rect(10, 30, 2, 2), SettingsWindow, "Settings");
}
}