默认锚点是0.5,0.5 子节点出现在父节点正中间, 一般程序而言,无论是运动逻辑还是其他操作都是从左下角开始。你这搞个从正中间,有何意义,我要执行逻辑还要时刻获取父节点的大小才能判断和操作子节点位置。 而后期父节点锚点一旦有修改,效果可能会有点难以想象了。特别希望改回原来的坐标系统。
对于美术而言,怎么定位置都是无所谓的,只要编辑器里显示的和游戏里显示的一样就可以了。但是脚本生成新的子元素。用的最多的肯定不是生成在正中间,而是左下角开始的位置,对于显示在正中间,找位置和定位实在难受,并不是习惯问题,而是真的不好获取,要经过多次计算,真是太不友好。
对您提到的:
一般程序而言,无论是运动逻辑还是其他操作都是从左下角开始
能举个更具体一点的例子吗?什么情况下需要从父节点的左下角开始?
执行逻辑时为什么不能直接拿子节点的位置?
父节点的锚点可以根据需要设成左下角(0, 0),每个人根据自己程序逻辑的需要可以自己安排,并没有强迫你一定要从中间开始。
以前大家创建 sprite 之后写的最多的一句就是 sprite.setPosition(parent.width/2, parent.height/2),现在我们修改了默认坐标系以后这句话可以不用写了,如果你希望程序创建的父节点锚点是左下角,只要多写一句 parent.anchorX = 0, parent.anchorY = 0 就可以了
画在画布这个父节点不就是父节点 所有东西都在这里定位
您提到的:
但是脚本生成新的子元素。用的最多的肯定不是生成在正中间,而是左下角开始的位置,对于显示在正中间,找位置和定位实在难受,并不是习惯问题,而是真的不好获取,要经过多次计算,真是太不友好。
能解释一下吗?为什么用得最多的是左下角
对于所说的写的最多的就是定位在中心点 写的最多的是sprite.setPosition(parent.width/2, parent.height/2)这点 只有学习过程中的人才会经常写吧。
看我发的图,也就是学习的第一个例子.B是根结点 就是画布 A是跳动的元素 C是地平线 需求1: 把A放在地平线上, 需求2: 判断跳动的包子是否触边
原写法 A.setPosition(B.width/2,C.height) if(A.getPositionX()<0 || A.getPositionX()>B.width)
现写法 A.setPositionY(-B.heightB.anchorX +C.height) if(A.getPositionX()>B.widthB.anchorX || A.getPositionX()>B.width*B.anchorX)
如果界面是美工做的。改anchor就又出问题了
由于子节点和父节点锚点有关联.当后期改变父节点锚点的时候,子节点位置就会出问题.
比如开始从中心点旋转,后期改成右上角旋转. 这时候他上面的子节点位置就会乱掉. 而原来的就不会出现这个问题
再比如写一个跟随鼠标运动的精灵
讲真, 原坐标系用着好好的为什么要换呢? 如果其他游戏向这方面移植,会不会光改坐标就是很大一个工作呢?
我们玩的玛丽奥不就是从左下角出来的,当然这是玩笑。开始学习的时候为了直观的看效果确实是经常把子节点放在中间,但用来开发的几个项目就不会再以中心点为基点了。特别是X轴,假如父节点的大小会动态增加的话。现在的坐标系统就会出问题。 现假如父节点是超级长的地图话,位置怎么设置
开始学习的时候为了直观的看效果确实是经常把子节点放在中间,但用来开发的几个项目就不会再以中心点为基点了。
我也算做了10年游戏了,一直都习惯于设置在父节点的中心点。我个人不太理解一个编辑器,创建的子物体默认会跑到父物体的下方这种做法。而且假如我是一个美术/策划,或者将来 Creator 支持 3D 以后,这种子物体一创建就跑到父物体最边上的行为,会更加让人困惑。
假如父节点的大小会动态增加的话。现在的坐标系统就会出问题。
会有什么问题?
假如父节点是超级长的地图话,位置怎么设置
你需要设置的是世界坐标,或者说是屏幕坐标,而不是局部坐标
原写法 A.setPosition(B.width/2,C.height) if(A.getPositionX()<0 || A.getPositionX()>B.width)
现写法 A.setPositionY(-B.heightB.anchorX +C.height) if(A.getPositionX()>B.widthB.anchorX || A.getPositionX()>B.width*B.anchorX)
建议如果你不需要设置居中,只需要判断左右,就把父节点的 anchor 设为 0, 0,这样就还是能用原来的写法
如果界面是美工做的。改anchor就又出问题了
请问具体会出什么问题?你是希望子物体永远相对父物体的 anchor 点进行定位吗?可以啊
由于子节点和父节点锚点有关联.当后期改变父节点锚点的时候,子节点位置就会出问题.
比如开始从中心点旋转,后期改成右上角旋转. 这时候他上面的子节点位置就会乱掉. 而原来的就不会出现这个问题
再比如写一个跟随鼠标运动的精灵
我亲自测试了一下,并没有看到你说的子节点会乱掉的问题啊,子节点还是好好的绕着父节点的anchor旋转
我觉得改中间反而是友好的
默认如果不设置子节点坐标就是(0,0) (0,0)就是左下角,这有什么好困惑的
锚点是设置一个节点各种动作的点,为什么要影响子节点的位置?
下图修改父节点锚点以后子节点的位置出现了问题
为什么根节点下的元素是(0,0) 而根节点下元素的子元素的(0,0)却成了中间呢?
假如说我程序创建一个节点, 无论被创建在哪里,位置都应该是我可以想象的, 但现在却要把位置考虑进父节点的锚点, 如果忘记写,会就出错, 比如创建在根节点下就是在左下角, 创建在其他节点下在中间, 或者锚点在其他位置, 那么这个节点的位置就无法想像了
如果出现这种情况,放置这张图不是非常难弄, 而以前只需要设置(0,0) 就能解决. 非常不理解为什么子节点的位置要和父节点的锚点挂钩
谢谢你的反馈,你看这样回答满意不
默认如果不设置子节点坐标就是(0,0) (0,0)就是左下角,这有什么好困惑的
这是我们经过多次讨论得出的结论,左下角是一个不常见的设定,现在我们只是想走回常见的道路
锚点是设置一个节点各种动作的点,为什么要影响子节点的位置?
下图修改父节点锚点以后子节点的位置出现了问题
假设大图是一个光标,子节点是光标上的中心点,这个中心点用来发射粒子
左图,美术一开始画了一个十字准心做为大图,子节点(粒子发射点)放在准心正中间。
右图,后来美术把十字准心改成了箭头指针,准心在指针的尖端,子节点(粒子发射点)是不是也应该自动跑到尖端才对?
所以我反而没看到问题在哪,毕竟一般父节点的中心位置的修改,伴随的是图片本身的调整,这时子节点是应该要跟着移动才对。
为什么根节点下的元素是(0,0) 而根节点下元素的子元素的(0,0)却成了中间呢?
根节点(场景)没有尺寸这个概念,所以你在根节点下的对象,默认都会和根节点重合。这也是常见 2D 和 3D 游戏引擎的通用做法。
非常不理解为什么子节点的位置要和父节点的锚点挂钩
请不要单单说不理解,最好提出实际开发中见到的问题,我们来解决实际问题才有意义
相对于中间点左下角确实不常放, 但这对于排版却是很有意义的, 如果节点下有数个子节点, 横竖排列都好. 这些子节点的坐标就会是有些是正数 有些却是负数,中间点常用我们是很容易获得的, 而获取到负数位置对于我们判断是不是很不容易呢?
如果两个图形组成一个图形 , 为什么这个图形围不同锚点运动的时候却要子节点也跟着变化?
假如说我程序创建一个节点, 无论被创建在哪里,位置都应该是我可以想象的, 但现在却要把位置考虑进父节点的锚点, 如果忘记写,会就出错, 比如创建在根节点下就是在左下角, 创建在其他节点下在中间, 或者锚点在其他位置, 那么这个节点的位置就无法想像了 这就是实际问题
如果节点下有数个子节点, 横竖排列都好. 这些子节点的坐标就会是有些是正数 有些却是负数,中间点常用我们是很容易获得的, 而获取到负数位置对于我们判断是不是很不容易呢?
如果父节点的尺寸是 0,你一样会有一堆负数的情况出现。在游戏中,不是所有父节点都有尺寸的。在游戏开发中 local position 出现负数是非常常见的。
如果两个图形组成一个图形 , 为什么这个图形围不同锚点运动的时候却要子节点也跟着变化?
我看不出问题在哪,这种需求很容易满足啊,请拿出具体点的例子
假如说我程序创建一个节点, 无论被创建在哪里,位置都应该是我可以想象的, 但现在却要把位置考虑进父节点的锚点, 如果忘记写,会就出错
原来那样才容易出错吧,子物体的坐标竟然要用父物体的尺寸参与计算…… 而且什么叫现在需要考虑父节点的锚点,还是那句话,请拿出实际例子,因为很多你觉得是问题的,根本不是问题
创建在根节点下就是在左下角, 创建在其他节点下在中间
创建在任何尺寸为 0 的父节点下,子节点都是在父节点正中间。根节点也一样,不存在什么左下角的情况,你会觉得跑到左下角,那是因为根节点本来就在左下角。
原来写一个需要居中的节点 node.setPosition(parent.width/2,parent.height/2)
现在需要写的 node.setPosition(parent.width*(0.5-parent.anchorX),parent.height*(0.5-parent.anchorY))
现在的很容易忘记写现在的这种写法 一旦父节点的锚点不在中心点,位置就不会居中.
比如有一组卡牌,有规律排列, 原来通过获取坐标很容易得出是第几张, 现在这是不容易的, 如果不考虑父节点锚点就会出错. 而锚点除了运动外是常被忽略的, 如果后期不经意变动,那就会出问题.
还有一点就是关于以前游戏的重写
再看下面的这个 , 也是个可能遇到的问题.
居中的节点请让美术直接在子节点上加 Widget,设置对齐到 horizontal center 或 vertical center 就可以了,不需要再写代码了(而且你的代码只能对齐一次,Widget 可以在运行时保持对齐状态)
忘记需要考虑锚点位置是改变规则以后的正常现象,请多一点耐心,转换一下思路,相信很快就能看到新规则带来的各种好处(尤其是编辑器里拼场景时)。
关于你说的通过位置获取索引的问题,我理解你从以前经验中产生的需求是「随手设置一个可以让父节点旋转的点作为锚点,子节点排列不受锚点影响」,但现在整个工作流都重新设计过了,比如卡牌索引的问题,应该是动态创建的时候就保存好索引,这样根本不用去算位置;而需要旋转父节点时,只要知道子节点会围绕父节点的锚点旋转,再根据需要重新设置好锚点位置就可以了吧?
以编辑器为核心搭建 UI 的工作流程和以前用代码写 UI 的流程是完全不同的,所以需要修改一些系统来更好的匹配现在的工作流程。对于旧项目如何移植,我们之后会推出更多案例给大家参考。