位置: 编程技术 - 正文

C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想(c#程序例子)

编辑:rootadmin

推荐整理分享C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想(c#程序例子),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:编程c#,c#简单程序实例,c#程序代码大全,c#入门必看实力程序100个,c#程序代码大全,c#的程序集,c#的程序集,c#程序例子,内容如对您有帮助,希望把文章链接给更多的朋友!

如果你接触过《设计模式》、软件架构的编程思想,就会知道优秀的设计准则:“组合优于继承的”。

这句话很简短,但开始学习OOP的时候,真切的是—-不太好理解(以我个人当初学习为例)。

OOP的继承思想

在设计主角(Player)的时候,为了能够复用A、B、C的功能,我开始把A、B、C按照继承来写,多了一些VirutalOverrideProtected等修饰符,功能没有任何问题,就是有些别扭。如Start、Update方法,只能在A中采用模板方法处理,万一B、C、Player中直接用了Start、Update方法,会导致奇奇怪怪的问题;同时在继承的基类中,无形之间多了一些包袱,对于Player不得不使用A、B、C的函数、变量(非private的)。

整个关系变为了:

Player is a APlayer is a BPlayer is a C

心理上疙疙瘩瘩的,总觉得有点别扭。

OOP的组合思想

以前使用组合思想较多的是构建树、树叶模型,例如电信中的网元模型。这种思想,属于Unity 3D的核心思想–组件。在Player、A、B、C中可自由使用Start、Update函数(请不考虑执行顺序,脚本组件的先后顺序外部可调整,但是意义不大),最重要的是,关系理顺了—主角变成更积极、主动。

Player have a APlayer have a BPlayer have a C在Unity 3D中,可复用的几乎全部为封装为了组件,eg: transform、rigibody、render、camera、***.cs脚本;为了配合方便的使用非内置的组件,可使用gameObject.AddComponent<T>()、gameObject.GetComponent<T>()来添加、获得组件(一般是自定义的脚本)。

这里我举一个实际的例子,在《Unity 3D手机游戏开发》第二版的“太空射击游戏”中,有一个需求,需要给游戏中可复用的GameObject添加自动销毁的功能(通过时间计时器,或者触发器添加),代码很简单,不到行,要添加的GameObject有5、6个,虽然工作量不大,但总不能每个都拷贝一遍代码吧。

开始我是按照OOP继承做的,

看了几天,很不爽,后来重构为如下图:

这样使得自动销毁组件的功能发挥的更加灵活、机动,即不必拘泥于静态的继承思想来实现。

C#程序员整理的Unity 3D笔记(十三):Unity 3D基于组件的思想(c#程序例子)

从这个重构过程中,我学到Unity 3D组件思想的闪闪发光……

附录:完整的自动销毁组件代码:

public class AutoDestoryComponent : MonoBehaviour { #region ICanCache public ParticleSystem[] m_pss = null; public int m_life = 1; //3条命 public float m_AutoDeadTime = 3;//3s自动销毁

private int m_life_Base = 3; //3条命【恢复用】 private float m_AutoDeadTime_Base = 3;//3s自动销毁【恢复用】【-1:表示不自动销毁,如Enemy】

void Update() { //需要自动销毁 if (m_AutoDeadTime_Base >= 0) { m_AutoDeadTime -= Time.deltaTime;

if (m_AutoDeadTime <= 0) { InnerDead(); return; } }

if (m_life <= 0) { InnerDead(); } }

/// <summary> /// 设置自动销毁数据 /// </summary> /// <param name="life_base">默认生命&#;</param> /// <param name="autoDeadTime_base">-1不自动销毁;其他数据代表销毁时间(单位s)</param> public void SetBasePara(int life_base = 1, float autoDeadTime_base = -1) { m_AutoDeadTime = m_AutoDeadTime_Base = autoDeadTime_base; m_life = m_life_Base = life_base; }

//是否启用 public bool IsUse { get; set; } //死后位置 public Vector3 DeathPosition { get { return new Vector3(, , ); } }

//复活 public void Init(Vector3 position, Quaternion rotation) { transform.gameObject.SetActive(true); transform.position = position; transform.rotation = rotation; IsUse = true; foreach (ParticleSystem item in m_pss) { item.Play(true); }

//有些绕 m_life = m_life_Base; m_AutoDeadTime = m_AutoDeadTime_Base; }

private void InnerDead() { IsUse = false; transform.position = DeathPosition; foreach (ParticleSystem item in m_pss) { item.Stop(true); }

this.gameObject.SetActive(false); } #endregion }

包括系统自带的Audio、Transform、Camera、Image、Button等等。GameObject是一个容器,没有Image的GameObject,只要新建一个空的GameObject,添加Image Component极为Image GameObject对象的。

也即是在Unity3D中,很少用GameObject.ID的概念,而是用GameObject.Tag、GameObject.name来区分不同的GameObject,且Tag、name不唯一。

结论:在Unity3D中,万事万物都是Component。

Unity的协同停止问题 Unity的官方文档上描述,停止Unity的单个协同是以下的代码:usingUnityEngine;usingSystem.Collections;publicclassexample:MonoBehaviour{IEnumeratorStart(){StartCoroutine(DoSomething,2

Unity游戏开发——C#特性Attribute与自动化 这篇文章主要讲一下C#里面Attribute的使用方法及其可能的应用场景。比如你把玩家的血量、攻击、防御等属性写到枚举里面。然后界面可能有很多地方要

Unity3D之Vector3.Dot和Vector3.Cross的使用 原文地址:Unity3D之Vector3.Dot和Vector3.Cross的使用在unity3D中,Vector3.Dot表示求两个向量的点积;Vector3.Cross表示求两个向量的叉积。点积计算的结果为数,而

标签: c#程序例子

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

上一篇:Shader Forge可视化Unity3D Shader编辑器一-简介(transformer可视化)

下一篇:Unity的协同停止问题(unity 协作)

  • 创业投资企业可以按照其对中小高新技术企业投资额的
  • 个体工商户营业执照需要什么材料
  • 年报的资产负债率在哪里
  • 个体定期定额怎么征税2023
  • 存续小微企业
  • 每个季度申报怎么申报?
  • 营业费用和管理费用比较
  • 盘亏的设备按正常报废处理是否符合会计制度要求
  • 金税盘备份文件名
  • 冲减营业税金及附加的分录
  • 30万的车税可以抵多少钱
  • 固定资产租入租金计入什么科目
  • 房地产企业预售阶段企业所得税
  • 生产车间用电产品有哪些
  • 产品售后维修产品介绍
  • 会计凭证的保管期限为多少
  • 土地增值税清算是什么意思
  • 公司在外地
  • 企业所得税审计的内容包括哪四个方面
  • 公司购买新办公楼装修计入什么科目
  • 公司注销了之后银行账户还能用吗
  • 贸易公司补交所得税怎么做账?
  • 管理费用明细是什么意思
  • 代账代税与自行核算申报应从哪几个角度考虑
  • 工地没有手续擅自开工违法吗
  • 工资五险一金缴费标准是多少
  • efi bios u盘启动
  • 行政划拨无偿取得的土地使用权属于什么资产
  • 水利基金减免了还用计提吗
  • 代开的发票没有人名行不行?
  • 命令提示符打错了怎么修改
  • win101903怎么查看
  • 白沙国家公园中标公告
  • 关于交易性金融资产的问题
  • php点击复制代码
  • php静态方法和非静态方法
  • 一个简单安全的小故事
  • 行政单位基建账如何并入大账
  • 用友u8反结账反记账的操作步骤
  • 支付国外佣金需要开票吗
  • 员工探亲证明怎么写
  • 资产支出加权平均数和一般借款本金加权平均数
  • 营改增一般纳税人简易征收的范围
  • 可供出售金融资产新准则叫什么
  • 政府补助的核算内容有哪些
  • 减免税在借方如何结转
  • sql server递归查询
  • 清税证明怎么在网上申请
  • 上月未结账本月不能结账
  • 事业单位以资产为准吗
  • 销货方和供货方的区别
  • 知识产权申请如何申请
  • 收到利息的会计凭证
  • 建筑行业的收入做什么科目
  • 公账上的钱怎么提出来
  • 经营租赁的房屋计提折旧吗
  • 月末库存商品能抵税吗
  • 从事国家重点扶持的公共基础项目
  • 差旅费属于其他费用吗
  • 房地产公司属于什么企业
  • 行程单如何验真伪
  • 企业租赁厂区的管理制度
  • 研发部门的房租一次记入还是分摊
  • 生产成本和主营业务收入的关系
  • mysql的表文件在哪
  • mysql5.7.17 zip 解压安装详细过程
  • win7系统笔记本怎么调节电脑亮度
  • win10系统打开cad出现致命错误
  • cocos2dx 3.17
  • [置顶]游戏名:chivalry2
  • node.js中使用文件流进行文件复制,首先需要创建一个
  • jquery如何调用
  • unity灯光闪烁效果
  • android如何防止js注入
  • 安卓app控件
  • python 正则 \s
  • 个人所得税怎么换手机号绑定
  • 邮储银行优势及特长简介
  • 建安企业异地个税怎么交
  • 税务检查的程序
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设