首页 > 解决方案 > GKAgentDelegate 的子类不调用 agentDidUpdate

问题描述

如果我在 GameViewController 中将委托设置为“自我”,但当委托设置为 Player 类时,这两个类都是 GKAgentDelegate,谁能告诉我为什么 agentDidUpdate() 有效。该项目可以在这里下载-> https://drive.google.com/open?id=10l44gSKmhiYz21FDYEOKrWKU-y_ScCEL

GameViewController.swift

//This works
 func createPlayerAgent()
    {
        let p = Player()
        let agent = GKAgent3D()
        agent.delegate = self
        agent.behavior = GKBehavior()
        agentSystem.addComponent(agent)
    }
//This does not
 func createPlayerAgent()
    {
        let p = Player()
        let agent = GKAgent3D()
        agent.delegate = p
        agent.behavior = GKBehavior()
        agentSystem.addComponent(agent)
    }

@objc func renderer(_ renderer: SCNSceneRenderer,updateAtTime time: TimeInterval)
{
    print("renderer")
    // Calculate delta since last update and pass along to the agent system.
    if (self.lastUpdateTime == 0) {
        self.lastUpdateTime = time;
    }

    let delta = time - self.lastUpdateTime
    self.lastUpdateTime = time;
    print(delta)
    self.agentSystem.update(deltaTime: delta)
}

@objc func agentDidUpdate(_ agent: GKAgent3D)
{
    print("agentDidUpdate")
}

播放器.swift

import Foundation
import GameplayKit

class Player:NSObject , GKAgentDelegate
{

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init()
    {
        super.init()
    }

    @objc func agentDidUpdate(_ agent: GKAgent3D)
    {
        print("---agentDidUpdate")

    }

}

标签: iosswiftscenekit

解决方案


这是一个范围问题。函数结束后,p会被释放而不保存。

   {
    let p = Player()
    let agent = GKAgent3D()
    agent.delegate = p
  }

您必须保存 p 才能使其生存。


推荐阅读