unity OnInspectorGUI方法调用时候没有重新拉取变量的值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了unity OnInspectorGUI方法调用时候没有重新拉取变量的值相关的知识,希望对你有一定的参考价值。

当我在面板中改变变量值时候 OnInspectorGUI函数被调用 但是在此函数中打印的变量值却没有发生变化 求解!!!!!!!!!!!!!!!

我看不懂你这段代码的意思,不知道你需要的是什么功能。你可以看看以下我打得总结 首先,Unity会自动为Public变量做序列化,序列化的意思是说再次读取Unity时序列化的变量是有值的,不需要你再次去赋值,因为它已经被保存下来。 参考技术A

不知道你具体问题是什么样的,提供几个可能解决的方法:

      在编辑器脚本中,添加OnEnable方法,将你的变量值放在其中,例:

      private SerializedObject conveyorLogic;//序列化

      private SerializedProperty  width;//定义类型

      private void OnEnable()

      conveyorLogic = new SerializedObject(target);

      width = conveyorLogic.FindProperty("Width");

      在OnInspectorGUI方法中写入:

      conveyorLogic.Update();

      EditorGUILayout.PropertyField(width);

      conveyorLogic.ApplyModifiedProperties();//应用

参考技术B 我也遇到跟楼主一样的问题了,就在其中一台电脑上才出现。猜测可能哪里有添加了多个组件导致,但是查了一圈确实没找到存在多个,就很迷,直接使用static标识下就好了。记录一下。

Unity3D 调用其他脚本函数方法

        在Unity中,我们经常需要在某个脚本中调用另外一个脚本中的函数,这时候问题就来了,我们该怎么让一个脚本中的函数被其他脚本访问到呢?其实有很多种方法,在这里记录一下,防止以后忘记。


(一)、被调用脚本函数为static类型,调用时直接用  类名.函数名()

        对于静态的公有函数或变量,是可以在别的类中直接使用类名.函数名类名.变量名调用的,通常在GameManager或SoundManager这种整个游戏中都可能会调用到其中函数的脚本会这样使用。

        ① 静态公有函数,使用类名.函数名()直接调用。例如:

public class GameManager : MonoBehaviour 

    public static void HaHaHa()
    
        
    


// 在其他脚本中调用HaHaHa()函数
GameManager.HaHaHa();

        ② 单例模式,通过静态变量调用类中的公有函数,变量声明为static,函数不需要再声明为static。例如:

public class SoundManager : MonoBehaviour

    private static SoundManager _instance;
    public static SoundManager Instance  get  return _instance;  

    private void Awake()
    
        _instance = this;
    

    public void HaHaHa()
    
        
    


// 在其他脚本中调用HaHaHa()函数
SoundManager.Instance.HaHaHa();


(二)、通过获取需要调用脚本所挂载在的游戏对象,再从该游戏对象上获取脚本并调用其中函数

        先通过GameObject.Find("脚本所挂载在的物体的名字")找到游戏对象,再通过GetComponent<脚本名>().函数名()调用脚本中的函数,只能调用public类型函数。例如:

Enemy .cs脚本挂载在游戏对象“Enemy_1”上,需要在别的脚本中调用其中的TakeDamage()函数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour

    public void TakeDamage()
    
        
    



// 在其他脚本中调用TakeDamage()函数
GameObject.Find("Enemy_1").GetComponent<Enemy>().TakeDamage();

(三)、通过获取需要调用脚本所挂载在的游戏对象,再通过发送消息调用其中函数

        先通过GameObject.Find("脚本所挂载在的物体的名字")找到游戏对象,再通过SendMessage("函数名")调用脚本中的函数,可以调用public和private类型函数。例如:

Enemy .cs脚本挂载在游戏对象“Enemy_1”上,需要在别的脚本中调用其中的TakeDamage()函数。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour

    private void TakeDamage()
    
        
    



// 在其他脚本中调用TakeDamage()函数
GameObject.Find("Enemy_1").SendMessage("TakeDamage", SendMessageOptions.DontRequireReceiver);

        除了SendMessage,还有SendMessageUpwards和BroadcastMessage函数,三个函数的参数相似,都是方法名+方法的参数+额外信息选项组成。

SendMessageOptions

  1. SendMessageOptions.RequireReceiver //如果没有找到相应函数,会报错(默认是这个状态)
  2. SendMessageOptions.DontRequireReceiver //即使没有找到相应函数,也不会报错,自动忽略

区别

  1. SendMessage仅向指定对象的所有脚本推送消息
  2. SendMessageUpwards向指定对象和它的所有父物体推送消息
  3. BroadcastMessage向指定对象和它的所有子物体推送消息

以上是关于unity OnInspectorGUI方法调用时候没有重新拉取变量的值的主要内容,如果未能解决你的问题,请参考以下文章

Unity 自定义inspector界面如何显示数组

Unity:尝试调用事件时出错

Unity3D中的函数方法及解释

Unity3D中的函数方法和解释

unity脚本的基础语法

unity中三种调用其他脚本函数的方法