相关疑难解决方法(0)

在Unity中,Unity如何神奇地称呼所有"接口"?

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,那么传统的方法 - 因为我们无法访问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)

c# interface unity-game-engine

29
推荐指数
3
解决办法
3065
查看次数

为什么选择UnityEvent而不是原生C#事件?

我的意思是,UnityEvents比本机C#事件慢,它们仍然存储对接收器的强引用.因此,我发现使用UnityEvents而不是原生C#事件的唯一正当理由是它们与编辑器的集成.我忽略了什么吗?

c# events unity-game-engine

14
推荐指数
3
解决办法
6893
查看次数

如何在 Unity3D 中使用 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)

我的调试输出如下:

  1. “苏醒”
  2. “展出”
  3. 《在场开火》

但是“OnShowCalled”永远不会执行,Unity 的控制台中没有异常。我测试EventArgs.Empty而不是new EventArgs()如评论中提到的那样对我的问题没有影响。

期待任何帮助。

c# events unity-game-engine

3
推荐指数
1
解决办法
1万
查看次数

Unity3d随着时间的推移在特定点周围旋转

我正在写一个功能,在一段时间内慢慢转动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旋转?

c# interpolation unity-game-engine

1
推荐指数
1
解决办法
1535
查看次数

实现pin键盘,简化代码?

我在游戏中创建了一个键盘.我创建的游戏对象有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)

c# unity-game-engine

1
推荐指数
1
解决办法
286
查看次数

存储值类型变量的引用 C#

我正在尝试为我的游戏创建状态效果,例如那些会随着时间的推移影响玩家统计数据的东西。但是,我无法记住传递的变量,即应该修改的变量。假设你有一些状态效果,在 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)

c# parameters reference value-type unity-game-engine

0
推荐指数
1
解决办法
1533
查看次数