相关疑难解决方法(0)

将类型传递给通用Swift扩展,或者理想地推断它

说你有

 class Fancy:UIView
Run Code Online (Sandbox Code Playgroud)

你想找到所有兄弟姐妹的Fancy意见. 没问题 ......

    for v:UIView in superview!.subviews
        {
        if let f = v as? Fancy
            { f.hungry = false }
        }
Run Code Online (Sandbox Code Playgroud)

所以,尝试扩展,

public extension UIView
    {
    internal func fancySiblings()->([Fancy])
        {
            return (self.superview!
                .subviews
                .filter { $0 != self }
                .flatMap { $0 as? Fancy }
                )
        }
    }
Run Code Online (Sandbox Code Playgroud)

太棒了,你现在可以

    for f:Fancy in self.fancySiblings()
        { f.hungry = false }
Run Code Online (Sandbox Code Playgroud)

太棒了.

但,

如何推广该扩展以使用任何UIView子类型?

理想情况下,扩展可以推断出类型吗?还有一个类型?

所以,像......

public extension UIView
    {
    internal func siblings<T>( something T )->([T]) …
Run Code Online (Sandbox Code Playgroud)

generics functional-programming ios swift swift-extensions

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

在非MonoBehaviour类中使用coroutine

你怎么能在一个非Monobehaviour阶级的实例中传递Monobehaviour?我找到了这个链接,TonyLi提到你可以通过一个Monobehaviour来启动和停止一个类的实例中的协同程序,但他没有说明你怎么能这样做.他做了这个theEvent.StartEvent(myMonoBehaviour); 但是他并没有表明他从哪里获得了我的神经行为.我在互联网上环顾四周,但我似乎无法找到.

  • 编辑

这是我想要做的.我想在一个类的实例中运行一个协同程序.我还希望能够在类的实例中停止协程.我想这样做,以便我的场景中没有任何具有大型管理器的对象,并且我可以将代码重用于我想以这种方式打乒乓的任何对象.代码在一个方向上移动一个Gameobject然后休息一下并将其向另一个方向移动并再次休息等等.但我不能从课外开始协同程序.

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

[RequireComponent (typeof(Image))]
public class SpecialBar : MonoBehaviour {

    public float rangeX;
    public float breakTime;
    public float step;
    float startProgress = 0.5f;
    PingPongGameObject pingPonger;

    Color[] teamColors = new Color[]{new Color(255,136,0),new Color(0,170,255)};

    void Start()
    {

        for(int i = 0; i < teamColors.Length; ++i)
        {
            teamColors[i] = StaticFunctions.NormalizeColor (teamColors[i]);
        }

        pingPonger = new PingPongGameObject (gameObject.transform.position,
            new Vector3(rangeX,0.0f,0.0f),
            gameObject,
            startProgress,
            breakTime,
            step
            );
    }
}
Run Code Online (Sandbox Code Playgroud)

第二堂课是我的协程所在的地方.

public class PingPongGameObject
{
    float step; …
Run Code Online (Sandbox Code Playgroud)

c# unity-game-engine

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

如何委托调用动态方法名称和动态参数

它可以有一个盲目处理动态方法名称和动态参数的函数吗?

我正在使用Unity和C#.我希望在从场景中删除一个对象(被破坏)后,Gizmo的绘制会持续一段时间,所以我想动态地将绘图职责传递给另一个对象.

例如,我希望能够这样做:

GizmoManager.RunThisMethod(Gizmos.DrawSphere (Vector3.zero, 1f));
GizmoManager.RunThisMethod(Gizmos.DrawWireMesh (myMesh));
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,调用方法并且参数计数会有所不同.有没有办法实现我的目标,而无需为每个Gizmo类型编写一个非常精细的包装器?(有11个.)(侧面目标:我想添加自己的论点来说明经理应该多长时间绘制Gizmo,但这是可选的.)

c# unity-game-engine

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

扩展方法如何工作?

我想在Unity3d中为Vector3类创建一个扩展方法.但我似乎没有得到它.这就是我所拥有的:

public static class ExtensionMethods{

    public static Vector3 MaxValue(this Vector3 _vec3)
    {
        return new Vector3(float.MaxValue,float.MaxValue,float.MaxValue);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我想打一个Vector3.MaxValue,就像float.MaxValue用这行代码:

Vector3 closestPoint = Vector3.MaxValue;
Run Code Online (Sandbox Code Playgroud)

但后来我得到了这个错误:

error CS0117: `UnityEngine.Vector3' does not contain a definition for `MaxValue'
Run Code Online (Sandbox Code Playgroud)

我知道这会奏效:

Vector3 closestPoint = new Vector3().MaxValue();
Run Code Online (Sandbox Code Playgroud)

但后来我创建了2个新Vector3实例.一个在MaxValue通话中,一个在外面.是不是可以只使用这种代码制作一个并执行此操作:

Vector3 closestPoint = Vector3.MaxValue;
Run Code Online (Sandbox Code Playgroud)

c# extension-methods unity-game-engine

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