unity中如何提取子物体的世界坐标

unity中如何提取子物体的世界坐标,第1张

一、生成物体之后,看Hierarchy 面板中那子物体叫什么,

Vector3 pos = GameObjectFind ("name")transformposition;

二、生成预知体的时候返回生成的transform,找子物体。

Transform _transform = Instantiate("预知体",position, Quaternionidentity) as Transform;

Vector3 pos2 = _transformFindChild("name")transformposition;

假设你的脚本是添加到的子物体上的,可以直接用transformparentgameObject; 这个是你获取到的父物体 如果你的脚本不是添加在子物体上的,那么你需要通过"子物体transformparentgameObject"获得 另外,建议场景中的物体很多的时候最好不要用gameObjectFind()来寻找某个对象,这样会遍历场景中所有未被隐藏的物体,直到找到所符合的物体 另外,如果场景中的物体有重名的,可能会获取非意愿中的目标

Wowemu完整GM命令详解(包括可选模块)

注意: [ ] 是可选参数,< > 是必填参数,[arg=X] 表示这个参数的默认值是X

<arg:16>表示这个参数允许的值是1,2,3,4,5,6

命令前边的数字表示最小几级GM(PLevel)可以使用

数字后边的字母表示该命令在游戏中所适用的目标(鼠标点中):

t=所有目标

n=NPC

p=玩家

s=刷怪点

g=物件

信息显示命令:

0 HELP [command] - 显示所有命令列表或者具体某一命令的用法

0 WHERE - 显示地图map、区域zone的编号,以及座标 x,y,z 和方向 h

2t INFO - 显示所选择物件的相关信息

2np FACTION - 显示所选择物件的faction信息

2 ONLINE - 显示在线人数

4 TARGETGO - 自动选中离你最近的物件(gameobject)并显示其信息(选择不可见但其实已经选中)

4n TARGETLINK - 自动选中当前你所选中NPC的刷怪点

(如:某些NPC的刷怪点不容易看到或选到,你可以选中NPC后再执行这个命令,就会自动选择该NPC的刷怪点,再执行come就可以让刷怪点跑到你所处位置)

2t PINGMM - 在小地图上显示所选择的NPC位置

2p LISTSP - 列出所有已学的法术编号

2p LISTSK - 列出所有已学的技能编号

创建 *** 作命令:

4 ADD <ItemID> [Amount=1] - 创建指定数量的物品到你的背包中

4 ADDNPC <CreatureID> - 创建一个静止的NPC在你所处位置和方向

4 ADDGO <GameObjectID> - 创建一个物件在你所处位置和方向

4 ADDSPAWN - 创建一个空的刷怪点

4 ADDSPAWN [CreatureID] [Number=1] - 创建一个指定数量和生物的刷怪点

删除/杀死命令:

2t DEL - 删除所选中物件(声望点数不受影响)

4n KILL - 杀死所选中的NPC(声望点数要受影响)

4 KILLALLNPC - 杀死你周围的所有NPC

4 DELALLCORP - 删除所有玩家的尸体

NPC/物件处理命令:

4ns TURN - 使NPC/刷怪点面向你

4ns COME - 使选中的NPC/刷怪点走到你的位置

4np SETLEVEL <Level> - 设置NPC/玩家的等级

4np SETMODEL <Model> - 设置NPC/玩家的模型

5n SETNPCFLAGS <Flags> - 设置NPC标记为敌方还是同盟,如4为商人

4n SETSIZE <Size> - 设置NPC的模型大小

4np SETSPEED <Speed> - 设置所选择NPC的动画或者移动速度

4n PARALYSE - 设置所选择的NPC静止或者运动

4g MOVE - 移动标记的物件(游戏中选择不可见)到你当前的座标X Y Z

4n ROTATE - 旋转NPC的方向

刷怪控制命令:

4s SETSPAWNNPC <CreatureID> [Number] - 设置刷怪点刷的NPC id以及数量

4s SETSPAWNGO <GameObjectID> - 设置刷怪点刷物件(gameobject)

4s SETSPAWNDIST <min> [max] - 设置刷的怪的活动范围

4s SETSPAWNTIME <min> [max] - 设置重新刷怪的时间间隔

6 EXPORTSPAWNSXY <map> <x1> <y1> <x2> <y2> <filename> - 导出矩形范围的刷怪点到文件

6 DELSPAWNSXY <Map> <X1> <Y1> <X2> <Y2> - 移除该矩形范围内的所有刷怪点

6 DELSPAWNS - 移除当前区域内的所有刷怪点

6 RESPAWNALL - 重刷所有可刷新的物件或者NPC

6 CLEANUP - 移除所有已刷出的物件或者NPC

角色 *** 作命令:

2p RESURRECT - 复活选择的个人

6 EXPORTCHAR <PlayerName> <FileName> - 导出 <玩家> <文件>

6 IMPORTCHAR <FileName> - 导入 <文件>

4p LEARN <SpellID> - 学习 <魔法代码>

4p DELSP <SpellID> - 忘记 <魔法代码>

4p UNLEARN <SpellID> - 与DELSP定义相同

4p LEARNSK <SkillID> [SkillLevel] [MaxLevel=SkillLevel] - 学习 <技能代码> [技能的最大值或者1至300之间的数值]

4p DELSK <SkillID> - 忘记 <技能代码>

4p UNLEARNSK <SkillID> - 与DELSK定义相同

4p CLEARREP - 清除荣誉值

0 DISMOUNT - 下马

4p SETXP <XP> - 设置经验 <点数>

4p SETCP <TalentPoints> - 设置天赋 <点数>

4p KICK - 关闭服务器

传送命令:

2 GO <Map> [X=0] [Y=0] [Z=0] - 去<地图代码> [坐标轴X=数值0] [坐标轴Y=数值0] [坐标轴Z=数值0]

2 GOTRIGGER <TriggerID> - 触发点坐标 <触发点代码>

2 GONAME <PlayerName> - 移动到输入名字的个人或NPC <玩家名称>

2 GOGUID <ObjectGUID> - 移动到行会 <行会对象>

2 NAMEGO <PlayerName> - 将玩家移动到身边 <玩家名称>

服务端控制命令:

6 SAVE - 保存地图和玩家数据

6 SHUTDOWN - 保存地图,PP系统,玩家和关闭服务器

6 RETCL - 重新载入所有的TCL数据

6 RESCP - 重新载入所有的SCP数据

6 REHASH - 改写目标

2 CLEARQFLAGS - 清楚寻找标记

4 BROADCAST <Message> - 向全世界发布消息 <GM信息>

调试命令:

6 PPON - 收集路径点打开

6 PPOFF - 收集路径点关闭

6 BYTES - 排除故障

6 ADDDYN - 测试到竞技

2 STARTTIMER - 启动延迟

2 STOPTIMER <TimerID:02> - 关闭延迟 <延迟0到2之间>

6 TEST - 测试

2 SETAURA <AuraID> - 设置预兆数目 <预兆代码>

4 EXPLORATION <ZoneID> <Mask> - 打开你地图的位置 <地区代码> <屏蔽>

6 FLAG1 - 设置有毛病的标记

2 SETRESTSTATE <NewRestState:05> - 设置新建地区的测试 <新建地区0到5之间>

6npgSETFLAGS <FlagsType> <Flags> - 设置NPC或OG的面具 参数: <ftype> <flags>

6t GFLAGS <GFlags> - 设置gflags 为将要选择的 gameobject

6t GTYPE <GType> - Set gtype 为将要选择的 gameobject

荣誉系统命令:

5p SETHONOR <Points> - 设置玩家的荣誉点数 <点数>

5p ADDHONOR <Points> - 增加玩家的荣誉点数 <点数>

5p RESHONOR <Points> - 减少玩家的荣誉点数 <点数>

5p DELHONOR - 删除玩家的荣誉点数为0

0p GETHONOR - 给玩家获得的荣誉点数

0p GETRANK - 给玩家的评价

监狱系统命令:

0 FREE - 释放

4p JAIL <Days> <Hours> <Minutes> - 囚禁 <天数> <小时> <分钟>

4p UNJAIL [PlayerName] - 囚禁指定的玩家 [玩家姓名]

自动出狱设置命令:

0 STARTRESCUE - 开始倒计时,5分钟后自动离开监狱

0 AUTORESCUE - 启动营救

发个猎人连射的技能代码!真正的连续射击!!

learn 19767

没有冷却时间!真正的连续射击!!

用的是122日修复的的技能文件

learn 824 // 骑术:马

learnsk 148 // 骑术:马

learn 825 // 骑术:狼

learnsk 149 // 骑术:狼

learn 826 // 骑术:羊

learnsk 152 // 骑术:羊

learn 828 // 骑术:虎

learnsk 150 // 骑术:虎

learn 10861 // 骑术:迅猛龙

learnsk 533 // 骑术:迅猛龙

learn 10906 // 骑术:骸骨战马

learnsk 554 // 骑术:骸骨战马

learn 10908 //骑术:机械陆行鸟

learnsk 553 //骑术:机械陆行鸟

learn 18992 // 骑术:科多兽

learnsk 713 // 骑术:科多兽

train=2467 //战斗姿势Battle Stance

train=1612 //防御姿势Defensive Stance

train=2468 //狂暴姿势Berserker Stance

还要其他装备坐骑的命令就悬赏点分吧(:

这段代码的意思是,1s后每隔5s检测一次本物体的y坐标是否小于-2,如果小于那就跳转到场景1

就这么简单

除了看到那个loadlevel要大写外,没发现其他问题,你要改成什么样

显示当前时间的时钟

为游戏对象创建层级关系

编写脚本并与对象关联

使用命名空间

使用方法更新游戏物体

按时间进行旋转

在此教程中我们编写一个简单的C#脚本来制作时钟指针动画。

要求大家已经对Unity的编辑器有了基本的了解,其实,只需用过Unity几分钟就可以开始该案例了。

很快我们就能完成以下成果。

制作时钟

不用任何Unity资源包,我们从0开始创建Unity工程。缺省的场景中有一个位于 (0, 1, -10), 朝着z轴的负方向的摄像机,为了使摄像机中显示的透视图与场景一致,选择摄像机,并在菜单中选择执行 GameObject / Align View将摄像机与当前场景对齐。

啥是 游戏物体

子物体又是哈东东?

我们就简单用立方体来制作时钟的指针,为每个指针使用 GameObject/ Create Other / Cube 创建立方体。对于时针,设置其位置为 (0, 1, 0) ,三个轴上的缩放分别为 (05, 2, 05) ,对分针位置为 (0, 15, 0) ,缩放 (025, 3, 025) ,秒针的则分别是: (0, 2, 0)

(01,4, 01)。

创建的时钟,以及其中游戏物体间的层级关系。

制作时钟指针动画

要让时钟动起来,就得写点脚本了。在工程视图中右键,选择 Create/ C# Script 新建一个C#脚本,将其命名为 ClockAnimator。 双击打开之,将其中内容清空,从空文件开始。

首先,我们要引用Unity的命名空间,接着就是定义 ClockAnimator 类。将其定义为一个公开的类,继承自[MonoBehaviour]

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]

}

神马是命名空间?

类又是啥?

关于[MonoBehaviour]类?

这样我们就创建了一个可以作为组件的最小的类。保存之,接着从 Project 窗口中把它直接拖放到 Hierarchy (层级)视图的 Clock 游戏物体上,建立其与该游戏对象的关联。当然,也可以使用 Clock 游戏物体的 Add Component 按钮。

将ClockAnimator与Clock关联

要让指针动起来,我们得使用指针组件的 Transform 对象。首先,在刚才的脚本中为每个指针添加一个 Transform 变量,并保存它。这样,这些公开变量就成为可在编辑器中被赋值的组件属性,编辑器会获得这些游戏物体的 Transform 组件,并将它们赋予这些变量,选择 Clock ,将指针对应的游戏物体赋给这些属性。

变量是什么?

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]{

}

为空的ClockAnimator属性和填写属性后的ClockAnimator

下面在脚本中添加一个update方法。这是一个特殊的方法,它会在每一帧播放时调用,我们在这个方法中实现时钟指针的旋转。

using UnityEngine;

public class ClockAnimator : [MonoBehaviour]{

}

}

方法是啥?

[ Update ] 方法是否应当公开?

保存脚本,编辑器会提示组件中已经有了update方法,并在脚本组件的左侧出现一个复选框,这样我们就能禁用该脚本组件了,当然此时,还是要保持它处于可用状态。

ClockAnimator更新的显示了复选框

每个小时,时针要转动360/12度;分钟指针则是每分钟转动360/60度;而秒针是每秒旋转360/60度。为了程序中使用方便,我们把这些值定义为私有的浮点常量。

using UnityEngine;

public class ClockAnimator : [MonoBehaviour] {

}

常量有什么特殊性?

为了让时钟转动起来,每次update时,我们先得到当前系统的时间。System命名空间中的[DateTime] 结构体 可以用来存储时间,而该结构体中的静态属性Now可以返回当前时间,这样,每次update时,我们就先得到该值并将其存储到一个临时变量中。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour]{

}

什么是结构体?

属性又是什么?

要让指针转动,就需要更新指针的旋转,而这可以通过设置指针的localRotation实现。使用四元数:[Quaternion]可以定义任意角度的旋转。

因为摄像机朝向是z轴,Unity使用的是左手坐标系统,因此指针应该是绕着Z轴负方向进行旋转。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

时间显示为12:44

四元数quaternion是什么?

旋转又是啥?

改进时钟的实现

很好!在游戏的运行模式中,时钟已经可以显示当前的时间了,但是使用离散的时间值让它看起来更像是一个电子钟。下面增加一个选项,实现模拟时间显示。在脚本中添加一个公开的布尔变量 analog ,用它来决定update方法中的显示方式,这样我们就能在编辑器中直接控制时钟的显示方式了,即使是在游戏运行时。

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

添加了analog模式的ClockAnimator

对于模拟现实显示的选项,我们使用和之前稍稍不同的方式。这次不用[DateTime]Now,我们用[DateTime]NowTimeOfDay,这是一个时间段[TimeSpan]。返回的是自每天午夜开始到现在已经经过的小时,分钟和秒数。由于这个值是双精度数,使用时我们需要将它们转换为float类型。

类型转换的意思是

using UnityEngine;

using System;

public class ClockAnimator : [MonoBehaviour] {

}

按照模拟方式显示的时钟

现在时钟也可以按模拟方式显示了。

unitypackage PDF

原文链接:

>

GameObject是unity所有实体的基类

常用的函数

1GameObjectFind(“Cube”);

可以查找并获取一个指定的name为Cube的对象。然后进行其他 *** 作。

2GameObjectFindWithTag(“_cube");

和Find函数相似,不同之处在于该方法是通过标签(tag)值查找

3GameObjectSetActive(true);

激活/停用此游戏对象(如下图11所示打钩(true)的时候该游戏对象就属于激活状态,去掉打钩(false)就属于停用状态即游戏对象也就不会显示在你的视野内)

4GameObjectGetComponent

获取组件:如果这个游戏对象附件了一个type名称类型的组件,则返回该组件,否则为空。

hinge=gameObjectGetComponent("HingeJoint")asHingeJoint;

hingeuseSpring=false;

是一个每个对象都用的组件,用于储存并 *** 控物体的位置、旋转和缩放。(每一个Transform可以有一个父级,允许你分层次应用位置、旋转和缩放。可以在Hierarchy面板查看层次关系。他们也支持计数器(enumerator),因此你可以使用循环遍历子对象。)

1transformFind

是通过名字查找到子对象并返回他。

2TransformTranslate  平移

向莫一个方向进行移动多少的距离

移动变换由x沿着x轴,y沿着y轴,z沿着z轴

transformTranslate(0,0, TimedeltaTime);

transformTranslate(0, TimedeltaTime,0, SpaceWorld);

3Transformparent

通过该方法可以找到父对象,然后可以进行对父对象 *** 作(如改变父对象名字)

_childgameObjecttransformparentgameObjectname = "ParentBox";

4Transformroot

返回最根部父类进行 *** 作

string name=_childgameObjecttransformrootgameObjectname;

DebugLog(name);

5Transformposition

在世界坐标系中transform的·位置

6Transformrotation

Unity以四元数储存旋转角度。要旋转一个对象使用TransformRotate,使用TransformeulerAngles以欧拉角设置旋转角度。

7TransformlocalScale

相对于父级对象进行缩放(局部缩放)

transformlocalScale = new Vector3(05f,05f, 05f);

(为=时是对该物体进行缩小到后面参数的大小,+=时是对该物体进行放大)

8Transformforward

向前在世界空间坐标,变换的蓝色轴。也就是z轴。

在世界空间坐标,变换的蓝色轴。也就是z轴。

GameObjectFind()

通过场景里面的名子或者一个路径直接获取游戏对象。

GameObject root = GameObjectFind(“GameObject”);

我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。

GameObject root = GameObjectFind(“GameObject/Cube”);

GameObjectFind()使用起来很方便,但是它有个缺陷如下图所示,就是如果你的这个GameObject天生acive = false的话。那么你用GameObjectFind()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。

就这个问题我查过很多资料,最终也无果。。但是我用另外一个巧妙的办法可以解决它。(后面详解)或者你也可以提前把所有的游戏对象保存在内存中。

GameObjectFind()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObjectFind()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!

2 TransformFind()

还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用TransformFind()的话就可以很好的获取,另外Unity还提供了一个TransformFindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用TransformFind()可以取代。

如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。

值得注意的是,unity规定了比如父节点active = true 并且子节点的 active = true 都满足的情况下 才能全部显示。使用TransformFind()可以很方便的获取游戏对象,因为有了游戏对象,那么它身上的脚本啊组件啊什么的都可以很方便的获取到。

但是TransformFind()必须要保证你的顶级父对象的activity = true。举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)

你可以把“map”节点放在一个active = true的GameObject上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。

GameObject root = GameObjectFind(“GameObject”);      

GameObject map =  roottransformFind(“map”)gameObject;    

mapSetActive(true);

3 unity 还提供了几个获取游戏对象的方法,但是我个人觉得使用频率不高,这里也简单说两句。

GameObjectFindGameObjectsWithTag(“tag”)

GameObjectFindWithTag(“tag”)

根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。

ObjectFindObjectOfType

ObjectFindObjectsOfType

ResourcesFindObjectsOfTypeAll

根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。

还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。

transformGetChild(0)

以上就是关于unity中如何提取子物体的世界坐标全部的内容,包括:unity中如何提取子物体的世界坐标、如何删除gameObject下面的所有子物体、sql魔兽GM命令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9331923.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存