Unity有一个"界面":
IPointerDownHandler(doco)
你只需实现OnPointerDown ...
public class Whoa:MonoBehaviour,IPointerDownHandler
{
public void OnPointerDown (PointerEventData data)
{ Debug.Log("whoa!"); }
}
Run Code Online (Sandbox Code Playgroud)
Unity将"神奇地"调用OnPointerDown任何此类MonoBehavior.
您不必注册,设置事件,也不需要做任何其他事情.
你在语法上做的就是在类中添加"IPointerDownHandler"和"public void OnPointerDown",你可以神奇地获取这些消息.
(如果你不是Unity开发者 - 如果你在游戏运行时突然在编辑器中添加一个,它甚至可以工作!)
所以,我想这样做:
public interface IGetNews
{
void SomeNews(string s);
}
Run Code Online (Sandbox Code Playgroud)
然后我可以添加SomeNews 到任何MonoBehavior.
(顺便说一句:我觉得他们不应该称这些"界面",因为它基本上没什么就像一个界面 - 它恰恰相反!你可以说他们神奇地想要从一个以上的抽象类继承,我猜测.)
在旁边:
如果您之前没有使用过Unity,那么传统的方法 - 因为我们无法访问Unity魔法 - 只需向您的守护程序添加一个UnityEvent,它将发送有问题的消息:
public class BlahDaemon:MonoBehaviour
{
public UnityEvent onBlah;
...
onBlah.Invoke();
Run Code Online (Sandbox Code Playgroud)
假设您有Aaa,Bbb,Ccc等课程,希望得到这些消息.只需连接Unity事件(通过在编辑器或代码中拖动),例如:
public class Aaa:MonoBehaviour
{
void Awake()
{
BlahDaemon b = Object.FindObjectOfType<BlahDaemon>();
b.onBlah.AddListener(OnBlah); …Run Code Online (Sandbox Code Playgroud) 我的意思是,UnityEvents比本机C#事件慢,它们仍然存储对接收器的强引用.因此,我发现使用UnityEvents而不是原生C#事件的唯一正当理由是它们与编辑器的集成.我忽略了什么吗?
我使用 Winforms 使用 Events 已经有一段时间了,但我对 Unity 的东西仍然很陌生。我的项目只是让一些 C# 代码在 Android 上运行,所以不需要超级高效的解决方案,只需要一个有效的解决方案。
事件处理程序声明:
public event EventHandler OnShow, OnHide, OnClose;
Run Code Online (Sandbox Code Playgroud)
事件处理程序调用:
Debug.Log("OnShow");
if (OnShow != null)
{
Debug.Log("OnShow_Firing");
OnShow(this, new EventArgs());
}
else{
Debug.Log("OnShow_empty");
}
Run Code Online (Sandbox Code Playgroud)
事件处理程序在另一个脚本中添加但相同的游戏对象
void Awake(){
Debug.Log("Awake");
this.gameObject.GetComponent<windowScript>().OnShow += OnShowCalled;
}
private void OnShowCalled(object o,EventArgs e)
{
Debug.Log("OnShowCalled");
}
Run Code Online (Sandbox Code Playgroud)
我的调试输出如下:
但是“OnShowCalled”永远不会执行,Unity 的控制台中没有异常。我测试EventArgs.Empty而不是new EventArgs()如评论中提到的那样对我的问题没有影响。
期待任何帮助。
我正在写一个功能,在一段时间内慢慢转动90度.到目前为止一切正常,我只需要弄清楚如何使它围绕一个点旋转而不是围绕变换中心旋转.
protected bool _isRotating = false;
public IEnumerator RotateWithEasing(GameHelper.Axis axis, Vector3 isolatedAxisPoint, float inTime)
{
if(_isRotating)
{
yield break;
}
_isRotating = true;
var degrees = this.GetDegreesFromAxis(axis);
Quaternion fromAngle = transform.rotation;
Quaternion toAngle = Quaternion.Euler(transform.eulerAngles + degrees);
for (float t = 0f; t < 1f; t += Time.deltaTime / inTime)
{
transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t);
yield return null;
}
_isRotating = false;
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮我指出正确的方向,我如何修改它,以便它围绕指定的isolatedAxisPoint旋转?
我在游戏中创建了一个键盘.我创建的游戏对象有10个按钮:0-9.玩家必须输入4位数代码才能打开门.一旦玩家输入第一个数字,它就会显示在键盘的屏幕上.
我已经完成了所有基本代码,但我确信我已经以非常低效的方式完成了这项工作.现在,我已将以下功能附加到我的一个键上,实际上是数字键1:
public void Key1() {
if (digit1entered == false) {
digit1 = 1;
displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
print ("First digit entered");
digit1entered = true;
} else {
if (digit1entered == true && digit2entered == false) {
digit2 = 1;
digit2entered = true;
displaycode.text = digit1.ToString () + digit2.ToString () + digit3.ToString () + digit4.ToString ();
print ("2nd digit entered");
} else {
if (digit2entered == true && digit3entered == false) …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的游戏创建状态效果,例如那些会随着时间的推移影响玩家统计数据的东西。但是,我无法记住传递的变量,即应该修改的变量。假设你有一些状态效果,在 10 秒内减少你的健康 10 %是一旦构造函数消失了,这两个之间的引用就会被破坏,从那时起我只编辑一些从未使用过的变量。
这是我如何实例化状态效果
/// <summary>
/// Creates a status effect which ticks at specified period of time without any condition.
/// </summary>
public StatusEffect(float increase, EffectIncreaseType increaseType, float timeOfStatusEffect, float tickTime)
{
this.increase = increase;
this.endTimeOfStatusEffect = Time.time + timeOfStatusEffect;
this.tickTime = tickTime;
increaseCalculator = increaseType == EffectIncreaseType.Percentage ? increaseCalculator = (a) => (int)(increase / 100f * a) : increaseCalculator = (a) => (int)increase;
}
Run Code Online (Sandbox Code Playgroud)
这就是我现在如何使用它
public bool TryTrigger(ref int affectedProperty)
{
if (condition.Invoke(affectedProperty))
{
affectedProperty += …Run Code Online (Sandbox Code Playgroud)