位置: 编程技术 - 正文

使用unity3d需要注意到细节(unity3d需要什么语言)

编辑:rootadmin
移动GameObject是非常平常的一件事情,一下代码看起来很简单:transform.localPosition &#;= new Vector3 ( .0f * Time.deltaTime, 0.0f, 0.0f );但是小心了,假设上面这个GameObject有一个parent, 并且这个parent GameObject的localScale是(2.0f,2.0f,2.0f)。你的GameObject将会移动.0个单位/秒。因为该 GameObject的world position等于: Vector3 offset = new Vector3( my.localPosition.x * parent.lossyScale.x, my.localPosition.y * parent.lossyScale.y, my.localPosition.z * parent.lossyScale.z );Vector3 worldPosition = parent.position &#; parent.rotation * offset;换句话说,上面这种直接操作localPosition的方式是在没有考虑scale计算的时候进行的,为了解决这个问题,Unity3D提供了Translate函数,所以正确的做法应该是: transform.Translate ( .0f * Time.deltaTime, 0.0f, 0.0f );曝出在Inspector的变量同样的也能被Animation View Editor所使用有时候我们会想用Unity3D自带的Animation View Editor来做一些简单的动画操作。而Animation Editor不仅可以操作Unity3D自身的component,还可以操作我们自定义的MonoBehavior中的各个Property。所以加入 你有个float&#;需要用曲线操作,你可以简单的将它曝出到成可以serialize的类型,如:public float foobar = 1.0f;这样,这个变量不仅会在Inspector中出现,还可以在animation view中进行操作,生成AnimationClip供我们通过AnimationComponent调用。范例:public class TestCurve : MonoBehaviour { public float foobar = 0.0f; IEnumerator Start () { yield return new WaitForSeconds (2.0f); animation.Play("foobar_op"); InvokeRepeating ( "LogFoobar", 0.0f, 0.2f ); yield return new WaitForSeconds (animation["foobar_op"].length); CancelInvoke ("LogFoobar"); } void LogFoobar () { Debug.Log("foobar = " &#; foobar); }}GetComopnent<T> 可以取父类类型Unity3D 允许我们对MonoBehavior做派生,所以你可能有以下代码:public class foo : MonoBehaviour { ...} public class bar : foo { ...}假设我们现在有A,B两个GameObject, A包含foo, B包含bar, 当我们写foo comp1 = A.GetComponent<foo>();bar comp2 = B.GetComponent<bar>();可以看到comp1, comp2都得到了应得的Component。那如果我们对B的操作改成:foo comp2 = B.GetComponent<foo>();答案是comp2还是会返回bar Component并且转换为foo类型。你同样可以用向下转换得到有效变量:bar comp2_bar = comp2 as bar;合理利用GetComponent<base_type>()可以让我们设计Component的时候耦合性更低。Invoke, yield 等函数会受 Time.timeScale 影响Unity3D提供了一个十分方便的调节时间的函数Time.timeScale。对于初次使用Unity3D的使用者,会误导性的认为Time.timeScale同样可以适用于游戏中的暂停(Pause)和开始(Resume)。所以很多人有习惯写:Time.timeScale = 0.0f对于游戏的暂停/开始,是游戏系统设计的一部分,而Time.timeScale不不是用于这个部分的操作。正确的做法应该是搜集需要暂停的脚本或 GameObject,通过设置他们的enabled = false 来停止他们的脚本活动或者通过特定函数来设置这些物件暂停时需要关闭那些操作。Time.timeScale 更多的是用于游戏中慢镜头的播放等操作,在服务器端主导的游戏中更应该避免此类操作。&#;得一提的是,Unity3D的许多时间相关的函数都和 timeScale挂钩,而timeScale = 0.0f将使这些函数或动画处于完全停止的状态,这也是为什么它不适合做暂停操作的主要原因。这里列出受timeScale影响的一些主要函数和Component:MonoBehaviour.Invoke(…)MonoBehaviour.InvokeRepeating(…)yield WaitForSeconds(…)GameObject.Destroy(…)Animation ComponentTime.time, Time.deltaTime…Coroutine 和 IEnumerator的关系初写Unity3D C#脚本的时候,我们经常会犯的错误是调用Coroutine函数忘记使用StartCoroutine的方式。如:TestCoroutine.csIEnumerator CoLog () { yield return new WaitForSeconds (2.0f); Debug.Log("hello foobar");}当我们用以下代码去调用上述函数:TestCoroutine testCo = GetComponent<TestCoroutine>();testCo.CoLog ();testCo.StartCoroutine ( "CoLog" );那么testCo.CoLog()的调用将不会起任何作用。StartCoroutine, InvokeRepeating 和其调用者关联通常我们只在一份GameObject中去调用StartCoroutine或者InvokeRepeating, 我们写:StartCoroutine ( Foobar() );InvokeRepeating ( "Foobar", 0.0f, 0.1f );所以如果这个GameObject被disable或者destroy了,这些coroutine和invokes将会被取消。就好比我们手动调用:StopAllCoroutines ();CancelInvoke ();这看上去很美妙,对于AI来说,这就像告诉一个NPC你已经死了,你自己的那些小动作就都听下来吧。但是注意了,假如这样的代码用在了一个Manager类型的控制AI上,他有可能去控制其他的AI, 也有可能通过Invoke, Coroutine去做一些微线程的操作,这个时候就要明确StartCoroutine或者InvokeRepeating的调用者的设计。讨论之前我 们先要理解,StartCoroutine或InvokeRepeating的调用会在该MonoBehavior中开启一份Thread State, 并将需要操作的函数,变量以及计时器放入这份Stack中通过并在引擎每帧Update的最后,Renderer渲染之前统一做处理。所以如果这个 MonoBehavior被Destroy了,那么这份Thread State也就随之消失,那么所有他存储的调用也就失效了。如果有两份GameObject A和B, 他们互相知道对方,假如A中通过StartCoroutine或InvokeRepeating去调用B的函数从而控制B,这个时候Thread State是存放在A里,当A被disable或者destroy了,这些可能需要一段时间的控制函数也就失效了,这个时候B明明还没死,也不会动了。更 好的做法是让在A的函数中通过B.StartCoroutine ( … ) 让这份Thread State存放于B中。// class TestCortouinepublic class TestCoroutine : MonoBehaviour { public IEnumerator CoLog ( string _name ) { Debug.Log(_name &#; " hello foobar "); yield return new WaitForSeconds (2.0f); Debug.Log(_name &#; " hello foobar "); }} // component attached on GameObject Apublic class A: MonoBehaviour { public GameObject B; void Start () { TestCoroutine compB = B.GetComponent<TestCoroutine>(); // GOOD, thread state in B // same as: compB.StartCoroutine ( "CoLog", "B" ); compB.StartCoroutine ( compB.CoLog("B") ); // BAD, thread state in A StartCoroutine ( compB.CoLog("A") ); Debug.Log("Bye bye A, we'll miss you"); Destroy(gameObject); // T_T I don't want to die... } }以上代码,得到的结果将会是:B hello foobar A hello foobar Bye bye A, we'll miss youB hello foobar 如不需要Start, Update, LateUpdate函数,请去掉他们当你的脚本里没有任何Start, Update, LateUpdate函数的时候,Unity3D将不会将它们加入到他的Update List中,有利于脚本整体效率的提升。我们可以从这两个脚本中看到区别:Update_.cspublic class Update_ : MonoBehaviour { void Start () {} void Update () {}}Update_.cspublic class Update_ : MonoBehaviour {}

推荐整理分享使用unity3d需要注意到细节(unity3d需要什么语言),希望有所帮助,仅作参考,欢迎阅读内容。

使用unity3d需要注意到细节(unity3d需要什么语言)

文章相关热门搜索词:unity3d需要电脑配置,unity3d支持什么语言,unity3d支持什么语言,unity3d需要电脑配置,unity3d需要编程吗,unity3d需要什么配置,unity3d需要什么配置,unity3d需要什么配置,内容如对您有帮助,希望把文章链接给更多的朋友!

Unity3D Mac(苹果)版 破解安装方法,供学习用 大部分版本破解补丁下载地址:

NGUI学习笔记(摘)

NGUI之UITab Bar的不能将Sprite与SelectedSprite设置成相同的精灵 如图,我想把选中的样式的Sprite选择跟正常情况下的一致,但是怎么选择都不行,后来调试到UITabBarInspector.cs,发现下面这段代码:voidSelectedSprite(stringsp

标签: unity3d需要什么语言

本文链接地址:https://www.jiuchutong.com/biancheng/375708.html 转载请保留说明!

上一篇:unity3d 怎样在一定时间连按两下键(unity3d怎么用)

下一篇:Unity3D Mac(苹果)版 破解安装方法,供学习用(unity开发用macbook怎么样)

  • 二手车没有发票能过户吗
  • 小规模未达起征点免税分录
  • 减少注册资金的理由有哪些
  • 股东借款怎么转为利润分配
  • 亏损金额需要对抵实收金额吗
  • 个人接受现金捐赠的例子
  • 交通运输行业属于什么性质
  • 实收资本能是现金流出吗
  • 计提存货跌价准备怎么计算
  • 一般纳税人取得普票怎么做账
  • 几个月以前发现便血是肠癌吗
  • 桐木板芯销售
  • 小规模纳税检查怎么做
  • 应交税费科目核算
  • 应计提的存货跌价准备
  • 出售库存的原材料表格
  • 出口销售收入怎么算
  • 个体户到税务局开专票
  • 企业交税的钱用在哪里
  • 印花税按次申报是什么意思
  • 员工生日福利申请
  • 公司一般户要做账吗
  • 小微企业如何备案
  • 退货抵扣是什么意思
  • 手机文件打开方式怎么设置默认
  • 独立账户负债核算内容
  • 合同资产和合同负债属于什么科目
  • 公司的实收资本是借款,但是利息由公司付,会计怎么做账
  • 公司收到搬运发票怎么做
  • 电脑中毒之后怎么办
  • 什么是产品?产品的举例子
  • xcode对应的macos版本
  • php实现简单的登录验证
  • 公司每年都有什么费用
  • 融资租入资产的入账价值可能是()
  • 在产品按定额成本计价法的特点
  • 一二级公路增值税税率
  • 小微企业的季度所得税怎么计算
  • Google I/O 2023 大会上发布了一些令人兴奋的技术和产品,让我们一起来看看吧!
  • thinkphp,onethink和thinkox中验证码不显示的解决方法分析
  • 土地使用权的折旧年限和折旧方法
  • css转换器
  • [九]深度学习Pytorch-transforms图像增强(剪裁、翻转、旋转)
  • hexdump windows
  • python函数的默认值
  • 哪些固定资产不能计提折旧
  • 在网上怎么样查个人征信
  • 年终奖要计入工资吗
  • 简易征收税率表
  • 免征和抵扣税额的区别
  • 上期未申报怎么办
  • mysql一对多关系如何一次性查出来
  • mongodb4.4.2安装教程
  • 认缴的出资额
  • 所得税汇算清缴调整后要账务处理吗
  • 月销售额不超过15万的免征增值税
  • 银行贷款损失的计算公式
  • 无追索权保理的说法
  • 个税租房抵扣细则
  • 用SELECT... INTO OUTFILE语句导出MySQL数据的教程
  • Windows10安装包下载
  • mysql5.7配置文件my.ini
  • Vista、XP、Windows7下非会员如何去除QQ2009的广告
  • safari 快捷键
  • ubuntu lnmp环境搭建
  • linux 操作系统
  • win8桌面在哪
  • 语音聊天能不能调出来
  • perl 字符串处理
  • js用变量值做参数
  • jquery怎么判断复选框选中
  • python3 pygame
  • 使用权资产
  • linux一些常用操作命令 (不定时更新)
  • 淘宝模拟生成器
  • 深入浅出jquery
  • 票种核定和税种核定的区别
  • 税控盘监控信息写盘失败时钟校准
  • 辽宁交管12123能用微信支付吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设