Вам нужно найти GameObject, который содержит компонент скрипта, на который вы планируете получить ссылку. Убедитесь, что GameObject уже находится в сцене, или Find
вернет null
.
GameObject g = GameObject.Find("GameObject Name");
Затем вы можете схватить скрипт:
BombDrop bScript = g.GetComponent();
Затем вы можете доступ к переменным и функциям скрипта.
bScript.foo();
Я только что понял, что на тот же день я ответил на очень похожий вопрос: Не знаю, как получить здоровье врага
Я немного расскажу о вашем вопросе, так как я уже ответил на это.
Что ваш код делает, так это: «Посмотрите в мой GameObject для BombDropScript
, большую часть времени сценарий не будет прикреплен к одному и тому же GameObject.
Также используйте setter и getter для maxBombs
.
public class BombDrop : MonoBehaviour
{
public void setMaxBombs(int amount)
{
maxBombs += amount;
}
public int getMaxBoms()
{
return maxBombs;
}
}
Объединение моей собственной попытки и подсказок, полученных из ответов Анурага Униала и Леннарта Регебро, лучше всего подходит для меня:
def todict(obj, classkey=None):
if isinstance(obj, dict):
data = {}
for (k, v) in obj.items():
data[k] = todict(v, classkey)
return data
elif hasattr(obj, "_ast"):
return todict(obj._ast())
elif hasattr(obj, "__iter__") and not isinstance(obj, str):
return [todict(v, classkey) for v in obj]
elif hasattr(obj, "__dict__"):
data = dict([(key, todict(value, classkey))
for key, value in obj.__dict__.items()
if not callable(value) and not key.startswith('_')])
if classkey is not None and hasattr(obj, "__class__"):
data[classkey] = obj.__class__.__name__
return data
else:
return obj
В Python есть много способов заставить объекты вести себя немного по-другому, например, метаклассы и тому подобное, и он может переопределять getattr и, таким образом, иметь «магические» атрибуты, которые вы не можете видеть сквозь dict и т. д. Короче говоря, маловероятно, что вы получите 100% полную картину в общем случае каким-либо методом, который вы используете.
Поэтому ответ таков: если он работает для вас в случае использования, который у вас есть сейчас, тогда код правильный. ; -)
Чтобы сделать код более общим, вы можете сделать что-то вроде этого:
import types
def todict(obj):
# Functions, methods and None have no further info of interest.
if obj is None or isinstance(subobj, (types.FunctionType, types.MethodType))
return obj
try: # If it's an iterable, return all the contents
return [todict(x) for x in iter(obj)]
except TypeError:
pass
try: # If it's a dictionary, recurse over it:
result = {}
for key in obj:
result[key] = todict(obj)
return result
except TypeError:
pass
# It's neither a list nor a dict, so it's a normal object.
# Get everything from dir and __dict__. That should be most things we can get hold of.
attrs = set(dir(obj))
try:
attrs.update(obj.__dict__.keys())
except AttributeError:
pass
result = {}
for attr in attrs:
result[attr] = todict(getattr(obj, attr, None))
return result
Что-то вроде этого. Однако этот код не протестирован. Это все еще не распространяется на случай, когда вы переопределяете getattr , и я уверен, что есть еще много случаев, которые он не охватывает и может быть не покрыт. :)
Я не знаю, какова цель проверки базовой строки или объекта? также dict не будет содержать никаких вызываемых объектов, если у вас нет атрибутов, указывающих на такие вызываемые объекты, но в этом случае разве это не часть объекта?
поэтому вместо проверки различных типов и значений позвольте todict convert объект, и если он вызывает исключение, введите исходное значение.
todict вызовет исключение только в том случае, если obj не имеет dict например
class A(object):
def __init__(self):
self.a1 = 1
class B(object):
def __init__(self):
self.b1 = 1
self.b2 = 2
self.o1 = A()
def func1(self):
pass
def todict(obj):
data = {}
for key, value in obj.__dict__.iteritems():
try:
data[key] = todict(value)
except AttributeError:
data[key] = value
return data
b = B()
print todict(b)
он печатает {'b1': 1, 'b2': 2, 'o1': {'a1': 1}} могут быть и другие случаи, которые следует рассмотреть, но это может быть хорошим началом
особых случаев если объект использует слоты, вы не сможете получить dict например, исправление
class A(object):
__slots__ = ["a1"]
def __init__(self):
self.a1 = 1
для случаев слотов может заключаться в использовании dir () вместо прямого использования dict