位置: 编程技术 - 正文

使用unity3d需要注意到细节(unity3d需要购买吗)

编辑:rootadmin
欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学院,致力于打造业内unity3d培训、学习第一品牌。 操作transform.localPosition的时候请小心  移动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);  }  }    GetComopnentT 可以取父类类型  Unity3D 允许我们对MonoBehavior做派生,所以你可能有以下代码:  public class foo : MonoBehaviour {  ...  }  public class bar : foo {  ...  }  假设我们现在有A,B两个GameObject, A包含foo, B包含bar, 当我们写  foo comp1 = A.GetComponentfoo();  bar comp2 = B.GetComponentbar();  可以看到comp1, comp2都得到了应得的Component。那如果我们对B的操作改成:  foo comp2 = B.GetComponentfoo();  答案是comp2还是会返回bar Component并且转换为foo类型。你同样可以用向下转换得到有效变量:  bar comp2_bar = comp2 as bar;  合理利用GetComponentbase_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 Component  Time.time, Time.deltaTime  Coroutine 和 IEnumerator的关系  初写Unity3D C#脚本的时候,我们经常会犯的错误是调用Coroutine函数忘记使用StartCoroutine的方式。如:  TestCoroutine.cs  IEnumerator CoLog () {  yield return new WaitForSeconds (2.0f);  Debug.Log("hello foobar");  }  当我们用以下代码去调用上述函数:  TestCoroutine testCo = GetComponentTestCoroutine();  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 TestCortouine  public 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 A  public class A: MonoBehaviour {  public GameObject B;  void Start () {  TestCoroutine compB = B.GetComponentTestCoroutine();  // 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 you  B hello foobar    如不需要Start, Update, LateUpdate函数,请去掉他们  当你的脚本里没有任何Start, Update, LateUpdate函数的时候,Unity3D将不会将它们加入到他的Update List中,有利于脚本整体效率的提升。  我们可以从这两个脚本中看到区别:  Update_.cs  public class Update_ : MonoBehaviour {  void Start () {}  void Update () {}  }  Update_.cs  public class Update_ : MonoBehaviour {  }更多内容,请访问【狗刨学习网】unity极致学院    声明:此篇文档时来自于【狗刨学习网】社区-unity极致学院,是网友自行发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。  

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

使用unity3d需要注意到细节(unity3d需要购买吗)

文章相关热门搜索词:unity3d花钱吗,unity3d需要购买吗,unity3d需要显卡吗,unity3d需要什么配置,unity3d需要电脑配置,unity3d需要购买吗,unity3d需要什么配置,unity3d需要显卡吗,内容如对您有帮助,希望把文章链接给更多的朋友!

事件委托机制实现GameObject之间的通信 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学

Unity AssetBundle爬坑手记 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学

Unity3D 事件 欢迎来到unity学习、unity培训、unity企业培训教育专区,这里有很多U3D资源、U3D培训视频、U3D教程、U3D常见问题、U3D项目源码,【狗刨学习网】unity极致学

标签: unity3d需要购买吗

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

上一篇:使用 Sublime Text 2 开发 Unity3D 项目(使用权资产)

下一篇:事件委托机制实现GameObject之间的通信(事件委托实现)

  • 哪些情况下可以无偿提供法律援助
  • 建筑公司分包项目违法吗
  • 公司给员工租的宿舍怎么交税
  • 认缴后怎么才算实缴
  • 管理费用借贷方都有,如何结转
  • 开发票时怎么操作收款人 复核人 开票人
  • 500元以内的商品都有哪些
  • 回购股份进行股权激励会计分录
  • 民办非营利组织幼儿园清算时固定资产如何处理
  • 筹建期间取得的专用发票怎么入账
  • 制造行业运输费包括哪些
  • 农场管委会是什么性质单位
  • 开票方与受票方的区别
  • 购车合同起什么作用
  • 固定资产评估费计入什么会计科目
  • 退票费报销凭证可以在机子上打印吗
  • 现金流量表的填制方法和构成
  • 进口采购交的增值税
  • 审计报告格式与范文怎么写?
  • 汽车罚款怎么进账
  • 员工两处取得的荣誉
  • 关于工程施工的劳动法规
  • linux的pipe
  • php判断https
  • win7如何调出浏览器
  • linux 创建sh
  • 咨询公司流程完整
  • 个人所得税计提缴纳会计分录
  • 来料加工方式中,料件和加工后
  • 员工出差火车票可以抵扣进项吗
  • 小规模纳税人没有进项发票怎么办
  • win11电源高性能模式代码
  • 微信公众号开发用什么语言
  • 小规模纳税人购入货物收到增值税专用发票
  • 农产品核定扣除增值税进项税额计算表
  • 银行利息增值税发票
  • 利润表净利润等于未分配利润吗
  • 差旅费过路费会计分录
  • 员工工资为零只缴纳社保,个税怎么处理
  • dedecms怎么改图片
  • 预缴增值税附加税
  • 报表中的盈余公积怎么算
  • mongodb 入门
  • 苗木免税只能开普票
  • 文件柜质量标准
  • 企业计提五险一金会计分录怎么写
  • 合并报表中的抵消分录是什么意思?
  • 公司注销实收资本有余额怎么处理
  • 待处理财产损益是什么意思
  • 汇算清缴时资产折旧怎么填
  • 购买软件使用权计入无形资产吗
  • 增值税普通发票可以抵扣吗
  • 工程收据怎么开表格
  • 金税盘发票认证怎么操作流程
  • 资金股东占股比例
  • 小规模公司购买成本票严重吗
  • 汽车费用包括哪些会计科目呢
  • 商业企业注销应检查哪方面的问题
  • mysql使用技巧
  • win8系统怎么创建局域网
  • mac可以远程连接windows吗
  • sbserv.exe - sbserv是什么进程 有什么用
  • win8.1进不了系统
  • linux中tail命令详解
  • 四步制作的花
  • cocos roadmap
  • 如何理解js中的原型
  • python函数enumerate
  • intent传递数据的方法
  • bat批处理命令大全
  • 批处理程序删除文件夹中临时文件
  • unity3dwasd移动
  • 用vue做项目加入购物车是怎么做到的
  • jquery中有几种方法可以来设置和获取样式
  • 江苏电子税务局官网登录入口
  • 国家税务总局12366纳税服务平台
  • 北京国家税务网官网首页
  • 软件销售增值税优惠
  • 在网上购物是否隔断时间就要实名
  • 石狮纳税企业排名
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设