【技术】Unity3d的布局 SceneView
基础介绍:
Unity3d的布局
Scene View (场景视图)-用于放置物体
(资料图片仅供参考)
Game View(游戏视图)-表示游戏在运行时的外观
Hierarchy(层次视图)-当前场景中的游戏物体的列表用来放置GameObject.
Project(工程视图)-显示当打开工程所有可用的物体和资源
Instpector(检视视图) -显示当前选中物体的细节和属性
基本组成:
GameObject,可以携带各种Component(每个GameObject至少带有Transform组件,所有的组件都可以从顶部菜单Component里面找到并添加给游戏对象)。
Component组件,附加在GameObject上,不同的组件可以使GameObject具有不同的属性,Transform、碰撞器、刚体、渲染器等都是组件,脚本也是组件的一种,对象所表现出来的行为都是由组件实现的。
预制:
用于程序运行时,动态实例化对象的“母体”,比如,在射击类游戏中,子弹的生成就可以使用实例化预制的方式来实现,这就好比是Flash中的各种Display类,你可以定义它的各种属性方法,然后在使用的时候直接实例化一个实例。
在project面板右击选择Creat——Prefab新建一个预制,将Hierarchy面板中要制成预制的对象拖到这个新建预制上即可。
标签和层:
标签(tag)用于辨别物体,与name类似,使用对象的tag和name都可以找到对应的物体(GameObject.Find(“Name”)、 GameObject.FindWitnTag(“Tag”))。默认是Untagged,可以通过Inspector面板里面Tag的下拉菜单选择Add Tag项来添加新的标签, 在tagmanager中点开Tags左侧的小三角 通过size来增加标签的数量,每个Element内都填入新标签的名字
层(layer),在使用某些功能的时候,可以通过层来过滤不需要运用该功能的对象,也就是把该功能运用到特定的层,比如,相机的Culling Mask属性,通过选择特定层可以实现只显示位于被选中的层的对象。层的添加也是在标签管理器中,Unity已经设置了8个层,你是不能对这8个层进行修改的,你可以从第9个(也就是user layer8)开始添加你定义的层。
资源:
.unitypackage格式的文件可以直接import到unity中,记住最好是在打开unity的情况下,在project面板里右击,然后在import packages中选中你要导入的资源。注:Unity不识别中文路径,因此要导入的资源千万不要放在中文目录下!!!还有你的工程也不要新建在中文目录下!!!(你新建工程的时候选择中文路径的话,也建不起来~)也可以把你的场景打包,导出.unitypackage资源包,然后可以在其他项目中导入使用。(在project面板里右击, export package)另外,利用工程面板(project)右键菜单中的import new assets可以导入其他形式的资源,如,模型、音频、视频等,当然也可以直接将外部文件夹中的资源拖到project中的方式完成导入。
物理引擎:
unity使用NVIDIA PhysX物理引擎
碰撞器:各种基本体的碰撞器(box、sphere、capsule、cylinder),网格碰撞器(mesh collider)、车轮碰撞器(Wheel collider)、地形碰撞器(terrain collider)——碰撞器组件在你选中对象的时候会以绿色线框显示。
碰撞检测:碰撞器碰撞检测、光线投射(射线)、触发器碰撞检测,通过碰撞检测可以得到与当前对象发生碰撞的对象信息,使用碰撞的相关函数OnCollisionEnter(碰撞器碰撞检测)、OnTriggerEnter(触发器碰撞检测)、Physics.Raycast(光线投射)获取。
刚体:模拟物体物理现象的基础,加了刚体组件才能模拟重力、阻力等。
力:作用于刚体,你只要通过添加各种力,就可以使刚体表现出跟现实中一样的受力情况。
坦克大战知识点介绍:
*新建坦克的时候创建Cube,来进行坦克物体的坐标矫正,把坦克的position设置为0。(如果直接放置坦克可能会有坦克移动或者碰撞时 慢、飘起来的情况。)
1.
坦克移动通过forward,up,right来设置方向
forward
Shorthand for writing Vector3(0, 0, 1) 写Vector3(0, 0, 1)的简码,也就是向z轴。
upShorthand for writing Vector3(0, 1, 0) 写Vector3(0, 1, 0)的简码,也就是向y轴。
rightShorthand for writing Vector3(1, 0, 0) 写Vector3(1, 0, 0)的简码,也就是向x轴。
坦克移动的脚本 写在void Update ()函数里面
//移动
if (Input.GetKey (KeyCode.UpArrow)){
transform.Translate(Vector3.forward*Time.deltaTime*10);
}
//旋转
if (Input.GetKey (KeyCode.LeftArrow)) {
transform.Rotate(Vector3.up*Time.deltaTime*-60);
}
2.给坦克加上box collider和rigidbody两个物理属性。
Collider是最基本的触发物理的条件,例如碰撞检测。基本上,没有Collider物理系统基本没有意义(除了重力)。
Rigidbody是物体的基本物理属性设置,当检测碰撞完之后,就要计算物理效果,而Rigidbody就是提供计算基本参数的玩意。
Collider 必须搭配 Rigidbody 来使用,就像 Rigidbody 必须搭配 GameObject一样。
3.因为子弹在游戏中会出现很多,所以应该用prefabs来制作,这样可以有效的节省游戏资源。
让子弹碰撞到目标等待一段时间就消失
//碰撞检测
void OnCollisionStay(Collision collisionInfo) {
Instantiate(bomb, transform.position, transform.rotation);
StartCoroutine(WaitAndDestroy(0.5F));
}
//等待0.5秒让子弹消失
IEnumerator WaitAndDestroy(float waitTime) {
yield return new WaitForSeconds(waitTime);
//销毁子弹
Destroy(gameObject);
}
//当子弹数小于0等待3秒自动填装 因为update不停得刷帧所以加一个bFirst判断执行一次
if (iCurrentBulletCnt <= 0){
if (isFirst){
StartCoroutine(WaitAndShot(3.0F));
}
return;
}
if (Input.GetKeyDown(KeyCode.Space) && iCurrentBulletCnt > 0){
Rigidbody clone;
clone = Instantiate(Bullet1, FirePoint.transform.position, FirePoint.transform.rotation) as Rigidbody;
clone.velocity = transform.TransformDirection(Vector3.forward *50);
iCurrentBulletCnt-= 1;
isFirst = true;
}
//等待装填子弹
IEnumerator WaitAndShot(float waitTime){
if (isFirst){
isFirst = false;
yield return new WaitForSeconds(waitTime);
//填装100发子弹
iCurrentBulletCnt = 100;
}
}
4.音乐
Unity3D游戏引擎一共支持4个音乐格式的文件
.AIFF 适用于较短的音乐文件可用作游戏打斗音效
.WAV 适用于较短的音乐文件可用作游戏打斗音效
.MP3 适用于较长的音乐文件可用作游戏背景音乐
.OGG 适用于较长的音乐文件可用作游戏背景音乐
GameObject -> CreateEmpty 创建成功后我命名为audio。
给audio添加一个AudioSource属性,这个属性非常的重要,Unity播放音乐主要就是要靠这个东西。
Component ->Audio ->Audio Source。
**给坦克加上音效,需要先给摄像机加上Audio Listener,这里强调一下AudioListenr ,它音频监听器,用来监听音乐文件的播放。这是一个重要的属性,一定要勾选,只有勾选后才可以进行音乐的播放。
5.两个脚本相互调用
1)如果两个已经绑定在gameobject上
设置gameobject的tag值 这里设为fire.
在Script1.cs里有两个方法是
public void setBulletcnt(int iCnt){
iCurrentBulletCnt = iCnt;
}
public void jump(){
Debug.Log(“jump”);
}
在Script2.cs里调用
方法一:
GameObject.FindWithTag("fire").GetComponent
GameObject.FindWithTag("fire").GetComponent
方法二:
public Script1 other;
other = (Bullet)GameObject.FindWithTag("fire").GetComponent("Bullet");
other.setBulletcnt(50);
other.jump();
2)如果没有绑定在gameobject上
js调用js 直接脚本名.变量名 C#调用C#声明static public 变量名,然后脚本名.变量名调用 js调用C# var c = gameObject.GetComponent("脚本名"); 脚本名.变量名调用 C#调用js 脚本名c = (脚本名)gameObject.GetComponent<脚本名>(); 脚本名.变量名调用
ScriptA.cs里声明 static public void ChangeTool()
{
Debug.Log("========================"+"ChangeTool"+"========================");
}
调用:
ScriptB.cs里写ScriptA.ChangeTool();
动画Animation:
主要是将一帧帧的图片放进数组里然后通过renderer.material.mainTexture = animation0[icurFrame]来渲染。
6.场景切换
如果游戏有几个场景,需要在File->Build Settings里面设置场景顺序
用Application.LoadLevel(1)来切换场景。
MonoDevelop几个常用的快捷键
SHIFT + Tab 选中的代码左移
Tab 选中代码右移
CTRL + ALT +C 注释/不注释该行
CTRL+K 删除光标所在行的该行后面的代码
CTRL+ DOWN 像鼠标滚轮一样向下拖
CTRL + UP 像鼠标滚轮一样向上拖
CTRL + F 查找该脚本
CTRL + SHIFT + F 查找全部脚本
CTRL + H 替换代码
CTRL + SHIFT +W 关掉所有脚本
1:Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的,在Unity脚本内部有不同的特定函数,而且被指定调用,下列是几个最常见的:
Awake:场景被加载时候运行,在任何Start函数调用之前被调用
Start:这个函数常用初始化脚本对象,设置游戏对象开始状态(第一次),比如说太空大战游戏开始运行时候,敌方战机的随机下落。
Update: 这个函数在渲染一帧之前被调用,这里的代码是大部分游戏行为被执行的地方,游戏主体函数.
Fixeupdate:这个函数在每个物理(rigidbody)时间步被调用一次,这是处理基于物理游戏的地方。
LateUpdate:每一帧之后调用.
自定义句柄:
他们都以On开始,比如OnCollisionEnter,OnTriggerEnter,OnGUI等
2:Time
Time类包含了一个非常重要的类变量,称为deltaTime,这个变量包含从上一次调用Update或FixedUpdate(根据你是在Update函数还是在FixedUpdate函数中)到现在的时间量.
所以对于上面的粒子,修改它使这个物体以一个恒定的速度旋转而不依赖于帧率
void Update () {
transform.Rotate(0, 5 * Time.deltaTime, 0);
}
void Update (){
transform.Translate(0,0,2*Time.deltaTime);
}
如果你加或是减一个每帧改变的值,你应该将它与Time.deltaTime相乘。当你乘以Time.deltaTime时,意思就是:我想以 10米/秒移动这个物体不是10米/帧。这不仅仅是因为你的游戏将独立于帧而运行,同时也是因为运动的单位容易理解。
3.从MonoBehaviour继承
所有的行为脚本必须从MonoBehaviour继承(直接或间接)。在Javascript中这自动完成,但是必须在C#或Boo脚本中显示申明。如果你在Unity内部使用Asset -> Create -> C Sharp/Boo Script菜单创建脚本,创建模板已经包含了必需的定义。
public class NewBehaviourScript : MonoBehaviour {...} // C#
class NewBehaviourScript (MonoBehaviour): ... # Boo
4.使用Awake或Start函数来初始化
Javascript中放置在函数之外的代码,在C#或Boo中要放置在Awake或Start中。
Awake和Start的不同是Awake在场景被加载时候运行,而Start在第一次调用Update或FixedUpdate函数之前被调用,所有Awake函数在任何Start函数调用之前被调用。
5.类名必须与文件名相同
Javascript中,类名被隐式地设置为脚本的文件名(不包含文件扩展名)。在c#和Boo中必须手工做
6.不要使用命名空间
7.只有序列化的成员变量会显示在检视面板中
8.避免使用构造函数
二、 优化
1)尽量利用GetComponent来缓存对象
Transform _transform;
void Start(){
_transform = GetComponent
}
void Update(){
_transform.position += _transform.forward;
}
2)用作Texture的PNG图片,默认Texture Type为Texture;但用作GUI的PNG图片,需把Texture Type设为GUI,不然会有质量损失
3)着色器与硬件相关,不同的平台会做不同的优化,因此在Unity中,如果游戏运行在移动端,建议将模型的shader从Diffuse转为Mobile/Diffuse
4)位移比乘除速度快,对效率要求高,且满足2的幂次方的乘除方法,可以采用位移的方式:
左移相当于乘,左移一位相当于乘以2;
右移相当于除,右移一位相当于除以2;
C#的int最大32位(如果编译器默认64,就不是这个结果),所以1<<32 = 1<< 0
5)合理组织场景,a)方便管理 b)使用Unity官方提供的CombineChildren代码提高性能
6)使用Unity Remote远程调试(待测)
三、C#
1. 而不管是在Java还是C++中,一旦修改了被遍历对象,在修改前生成的iterator都会失效,所以《C++ Primer》及Java课本中曾警告过不要在用iterator遍历集合时增删集合元素,看来Objective-C中也是一样。结论:在Foreach(...)循环里尽量不要更改操作的源,
四、调试:
Debug.Log(string.Format("{0:d}", stateInfo.IsName("Base Layer.attack1")));
错误:
1.
unity3d的脚本里面最好不要写中文注释,不然有可能代码无效
例如:
//这里写注释的话可能下面的if代码就失效
if(bFirst)
2.all compiler errors to be fixed before you can enter playmode
所有的编译错误必须更正,在你进入(播放或游戏)模式前
3.Failed to call function PlayAnimation of class SimpleSprite
Calling function PlayAnimation with no parameters but the function requires 1.
参数有问题
五、插件:
iTween物体移动轨迹设定
NGUI 界面设计
EasyMotion2D 动画插件
六、组件
1.角色控制器
CharacterController controller;
controller = GetComponent
controller.Move(Vector3.right * Time.deltaTime*currentVel);
这里不能再用transform.position来运动物体。
七、总结
标签:
相关推荐:
最新新闻:
- 最新手机壳价格怎样?最新手机壳报价大全
- 视讯!ios8越狱后必装插件有哪些?ios8越狱后必装插件汇总
- 【技术】Unity3d的布局 SceneView
- 视频会议系统是什么意思?有哪些功能?-当前速看
- vr场景怎么做?VR视频制作教程|每日信息
- 微信塞班版为什么退出后会自动启动?问题出在哪里?
- Android 代码中文字在手机上显示乱码怎么办?解决方法_环球今亮点
- abb变频电机怎么样?abb变频电机价格是多少?
- 英语字母表你会背吗?26个英语字母表及字母音标
- 联想笔记本一键恢复7.0怎么用?详细方法步骤-天天快看点
- Word文档中如何输入汉字的偏旁部首?输入汉字的偏旁部首方法
- 一次汇报的内容有多页 如何用母版做美化?
- 世界速看:什么叫信息化管理?信息化管理相关介绍
- 苹果颠覆MP3 手机业的“创新”是怎么做到的?|环球报道
- 地磁场的基本形态与演化 你知道多少?
- bose家庭影院好吗?bose家庭影院有哪些优势?
- 世界速读:金松冰箱怎么样?金松冰箱多少钱?详细介绍
- 如何实现国产化替代?博思得凭借新一代OX平台技术做到了_世界速讯
- PS分配内存不足怎么办?解决方案来了
- 焦点要闻:camel_Apache Camel日志组件示例
- 全球热门:电商数据分析中的基础分析项目——京东订单数据预处理
- 天天微头条丨摩托罗拉xt532怎么刷机?摩托罗拉xt532刷机教程介绍
- 焦点速讯:高效空气过滤器有什么作用?高效空气过滤器作用介绍
- 人工生命中最关键的一步——虚拟细胞的构建|全球今日报
- GE带以太网接口的CPU协议有哪些特性?详情介绍
- nokia5300怎么刷机?nokia5300刷机教程及手机优势
- 百度闪付如何添加银行卡?百度闪付添加银行卡方法
- 环球观热点:反间计你知道吗?史上最经典的10大反间计
- getParameter和getAttribute的区别是什么?区别介绍 全球最资讯
- 如何在Win10登陆界面添加签名?Win10登陆界面添加签名方法
- 中国电池企业前十名有哪些?中国电池企业前十名介绍
- 中国互联网10大平台 2010年中国互联网十大开放平台大盘点
- 怎么打开优酷的kux格式?kux转换成mp4的方法 快看
- 常用的数学函数 数据分析最常用的excel函数公式大全 世界快看
- 德国曼瑞德温控器怎么样?德国曼瑞德温控器介绍
- d3dx9_34.dll是什么?系统d3dx9_34.dll错误会带来什么危害?|每日播报
- 华为nova5手机无法开机怎么办?华为nova5手机维修
- 什么是实数?数轴上的点与实数是什么意思?
- 下载软件哪个好?迅雷、迅雷和比特彗星下载工具介绍 全球微动态
- 科幻小说作家赫内·巴赫札维勒:时间旅行的悖论-全球滚动
- 什么是pdi检测?Pentaho数据集成的步骤
- 速递!FTP中文件名乱码问题怎么解决?Serv-U8字符编码的设置
- 如何使用任务计划程序来定时启动?黑客干货教程!-焦点消息
- JAVA模拟器安装方法 JAVA模拟器全功略!
- iPhone 15 采用 MFI 认证 C 口,没认证还是 5W
- 《生化危机4重制版》豪华版 将包含13个DLC|世界快资讯
- 30秒广告700万美元 “美国春晚”超级碗广告费创纪录-环球时快讯
- 抖音奔着超级APP2.0就去了|微速讯
- 户口迁移证怎么办理_户口迁移证办理方法
- Redmi K60官降:512GB仅2999元
- 全球微动态丨至强散热,比纸还薄!一加Ace 2 x 瑞声科技量身定制超薄超大VC
- 卢伟冰出手了!512G 版 Redmi K60 降至 3000 元以内_世界新动态
- 摄像头绝了!索尼Xperia 1 V渲染图曝光 观察
- 全球要闻:ChatGPT爆火:谷歌开始检查Bard AI代码数据
- 环球即时:小米 13 Lite 手机渲染图曝光:采用灵动岛设计
- 《CSGO》G2夺冠IEM卡托维兹 尼公子四进决赛终圆梦|全球速看
- 女子多设备同时登腾讯视频账号被封 解锁需超级会员_报资讯
- 世嘉新作《404 GAME RE:SET》公开新人物介绍 2023年春上线
- 开发商十分忙碌 《控制2》已进入概念验证阶段-热门看点
- 环球热讯:封杀《霍格沃茨之遗》的论坛运营者狂玩本作:太香了
- 【环球播资讯】情人节送巧克力,是不是没诚意?
- 聚焦:融资丨「派迅智能」完成数亿元B轮融资,赛富投资基金领投
- 年轻人选择“包地创业”,这门生意究竟有没有前景?
- 环球新资讯:“吃得多,还是瘦?”妻子一句话,丈夫查出大问题
- 赚钱新招儿!苹果的iPhone硬件订阅可能会在三月份到来_当前热议
- iPhone 15都没这功能!工程师通过添加USB-C制造双端口iPhone-环球快看点
- “灵动岛”双前摄设计!小米13 Lite曝光:天天关注
- 入职1小时被HR告知招错人补偿50元 当事人:很无奈
- 《生化危机4:重制版》豪华版带14款DLC 有专属藏宝图内容:环球微动态
- 《异修罗》确定制作TV动画 梶裕貴上田丽奈主演
- 创造新历史!IEM卡托维兹站《星际争霸2》中国选手李培楠夺冠
- 暴雪公布《暗黑破坏神》官方食谱 售价35美元
- 天天新消息丨From社公开大量《艾尔登法环》主题周边手办 多姿多彩
- 我在土耳其重灾区:仅一天内就看到13具遗体-全球微资讯
- 热讯:TP-Link机器人吸尘器可以连续两周不清空