ios - 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")
}
}
解决方案
这是一个范围问题。函数结束后,p会被释放而不保存。
{
let p = Player()
let agent = GKAgent3D()
agent.delegate = p
}
您必须保存 p 才能使其生存。
推荐阅读
- javascript - validateDOMNesting(...):文本节点不能作为子节点出现
- javascript - 如何使用 worker-loader 与 webworkers 创建 typescript 库
- java - 如何更新线程中的 JButton?
- swift - UIScrollView 无法滚动
- javascript - 当给定一个句子时,如何通过react中的迭代为每个单词(包括空格)创建一个边框?
- python - 如何从 python 模块(tqdm 模块)输出更改文本颜色?(所以不是python文本编辑器输出)
- clojure - 2 个参数到一个参数函数中
- c# - EF 核心 | 需要使用 Navigation 属性来更新一个属性,而不是另一个(模块)
- .net - 使用 HttpContextAccessor 访问 dotnet 3.1 中的登录用户
- laravel - Laravel 帆不支持依赖错误