unity3D学习之委托、事件全解析(二)
- 格式:doc
- 大小:178.50 KB
- 文档页数:13
unity onclick事件的用法Unity的OnClick事件是一种常用的用户交互事件,用于在用户点击特定的物体时触发相应的操作。
本文将详细介绍Unity OnClick事件的用法,包括如何绑定OnClick事件、如何实现点击效果、如何处理OnClick事件以及如何在代码中动态添加OnClick事件等内容。
让我们一步一步来回答这个问题。
一、绑定OnClick事件在Unity中,OnCLick事件可以通过两种方式绑定:通过Inspector窗口和通过代码。
首先让我们来看看如何通过Inspector窗口进行绑定。
1. 创建一个新的UI对象,比如Button。
2. 选中Button对象,在Inspector窗口中找到Button组件的OnClick 事件。
3. 点击“+”按钮,然后将需要触发的函数拖拽到弹出的选择框中。
4. 确认选择后,OnClick事件会自动绑定到所选的函数上。
通过以上步骤,OnClick事件就成功地与函数绑定了起来。
下面让我们来看看如何在代码中绑定OnClick事件。
1. 首先,确保你已经在代码中创建了一个Button对象的引用。
2. 在Start或Awake函数中,使用GetComponent<Button>()方法来获取Button组件的引用。
3. 通过button.onClick.AddListener()方法,添加一个需要触发的函数。
示例代码如下:Button button;void Start(){button = GetComponent<Button>();button.onClick.AddListener(OnClickEvent);}void OnClickEvent(){在这里编写触发点击事件时需要执行的代码}通过以上代码,OnClickEvent函数就会在点击按钮时触发。
二、实现点击效果在Unity中,通过OnClick事件可以实现一些常见的点击效果。
下面开始委托进阶部分的分享在此我分3个部分来说明表述1.带返回值的委托2.泛型委托3.委托的异步处理下面正式进入我们的主题委托进阶一、带有返回值的委托问:委托需要承载哪些信息呢?通过前面与大家分享的委托帖子中,不难答出,它存储了方法名,还有参数列表(方法签名).如://============================public delegate void testDelegate(int num);//============================其实,仔细看看上面语句,就会发现委托还同时承载了返回的类型,我把上面语句格式化下,相信大家就会明白了//=================================public delegate 返回类型ProcessDelegate(int num);//=================================上面委托定义的蓝色部分是声明委托的关键字,红色部分是返回的类型,黑色部分为委托的类型名,最后小括号中的就是参数部分啦.因此,要实现该委托就得满足下面2个条件:1、方法的返回类型和委托的返回类型必须一致;2、方法的参数也必须跟委托相同,这里是int类型.OK,就然我们一起尝试下吧!文章来自【狗刨学习网】代码如下:using UnityEngine;using System.Collections;public class babyTest : MonoBehaviour{// 定义具有返回值bool的委托public delegate bool ComparisonEventHandler(int cryid);public int cryid = 0;public GameObject[] objs;// Use this for initializationvoid Start (){ComparisonEventHandler _Comparison = Comparison01; //newComparisonEventHandler(new Test().Comparison01);_Comparison(cryid);}/// <summary>/// 方法01/// </summary>/// <param name="cryid"></param>/// <returns></returns>public bool Comparison01(int cryid){//...操作一些东西int num = 1;if (num == cryid){objs[0].SetActive(false);objs[1].SetActive(false);Debug.Log(string.Format("返回为true,恭喜找到baby哭的原因."));return true;}else{Debug.Log(string.Format("返回为false,未找到baby哭的原因"));return false;}}}运行如下:当我设置babyid为2的时候,获取返回值为false.当我设置设置baby为1的时候,获取返回值为true.二、泛型委托泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。
unity3D物体使⽤EventSystem响应事件在ugui中创建⼀个canvas 之后会⾃动创建⼀个EventSystem,⽤来处理UI上的时间响应。
(可以通过UI>EventSystem创建EventSystem)EventSystem有三个组件:EventSystem、StandaloneInputModule、TouchInputModule,后⾯两个组件都继承⾃BaseInputModule。
EventSystem组件主要负责处理输⼊、射线投射以及发送事件。
⼀个场景中只能有⼀个EventSystem组件,并且需要BaseInputModule类型组件的协助才能⼯作。
EventSystem在⼀开始的时候会把⾃⼰所属对象下的BaseInputModule类型组件加到⼀个内部列表,并且在每个Update周期通过接⼝UpdateModules接⼝调⽤这些基本输⼊模块的UpdateModule接⼝,然后BaseInputModule会在UpdateModule接⼝中将⾃⼰的状态修改成'Updated',之后BaseInputModule的Process接⼝才会被调⽤。
BaseInputModule是⼀个基类模块,负责发送输⼊事件(点击、拖拽、选中等)到具体对象。
EventSystem下的所有输⼊模块都必须继承⾃BaseInputModule组件。
StandaloneInputModule和TouchInputModule组件是系统提供的标准输⼊模块和触摸输⼊模块,我们可以通过继承BaseInputModule实现⾃⼰的输⼊模块。
除了以上两个组件,还有⼀个很重要的组件通过EventSystem对象我们看不到,它是BaseRaycaster组件。
BaseRaycaster也是⼀个基类,前⾯说的输⼊模块要检测到⿏标事件必须有射线投射组件才能确定⽬标对象。
系统实现的射线投射类组件有PhysicsRaycaster, Physics2DRaycaster, GraphicRaycaster。
unity3d中ontriggerenter和ontriggerexit的调用规律《Unity3D中OnTriggerEnter和OnTriggerExit的调用规律》在Unity3D中,有两个常用的触发器方法,分别是OnTriggerEnter和OnTriggerExit。
这两个方法在游戏开发中经常用来处理物体之间的碰撞和离开碰撞的情况。
在使用这两个方法时,需要注意它们的调用规律,以确保游戏逻辑的正确性。
首先让我们来了解一下OnTriggerEnter和OnTriggerExit方法的基本作用。
OnTriggerEnter方法在一个Collider(碰撞器)进入另一个Collider时被调用,而OnTriggerExit方法在一个Collider离开另一个Collider时被调用。
这两个方法可以在脚本中通过重写的方式来实现特定的功能,比如角色与物体的碰撞检测、触发特定事件等。
在实际使用中,需要注意OnTriggerEnter和OnTriggerExit方法的调用规律。
首先,在两个Collider中,必须至少有一个是触发器类型的Collider,也就是勾选了IsTrigger属性的Collider。
其次,这两个方法只被调用一次,即当一个Collider进入或离开另一个Collider时,对应的方法只会被调用一次。
另外,需要注意的是当一个Collider进入另一个Collider之后,OnTriggerExit方法不会立刻被调用。
而是要等待第一个Collider完全离开第二个Collider后,OnTriggerExit方法才会被调用。
这一点在处理游戏逻辑时尤为重要,因为有时候我们需要确保物体在离开碰撞区域后才执行特定的操作。
总的来说,在Unity3D中使用OnTriggerEnter和OnTriggerExit方法需要牢记它们的调用规律,确保在游戏开发中处理碰撞和离开碰撞的情况时能够顺利实现我们预期的游戏逻辑。
Unity3D-详解Quaternion类(⼆)OK,不做引⼦了,接上篇⾛起!四、Quaternion类静态⽅法Quaternion中的静态⽅法有9个即:Angle⽅法、Dot⽅法、Euler⽅法、FromToRotation⽅法、Inverse⽅法、Lerp⽅法、LookRotation⽅法、RotateToWards⽅法和Slerp⽅法。
关于静态的⽅法的使⽤就是直接⽤类名调⽤其静态⽅法,例如Quaternion.Angle(q1,q2);下⾯对这些静态⽅法做下分析。
1、Angle⽅法1.1 函数原型public static float Angle(Quaternion a,Quaternion b);该⽅法可以计算两个旋转状态a达到b时需要旋转的最⼩夹⾓。
1.2 实例演⽰using UnityEngine;using System.Collections;public class Angle_ts : MonoBehaviour {// Use this for initializationvoid Start () {Quaternion q1 = Quaternion.identity;Quaternion q2 = Quaternion.identity;q1.eulerAngles = new Vector3(30.0f, 40.0f, 50.0f);float a1 = Quaternion.Angle(q1, q2);float a2 = 0.0f;Vector3 v = Vector3.zero;q1.ToAngleAxis(out a2,out v);Debug.Log("a1: " + a1);Debug.Log("a2: " + a2);Debug.Log("q1的欧拉⾓: " + q1.eulerAngles + " q1的rotation: " + q1);Debug.Log("q2的欧拉⾓: " + q2.eulerAngles + " q2的rotation: " + q2);}// Update is called once per framevoid Update () {}}运⾏结果从输出结果可以看出a1和a2的值相等,即Angle的返回值是两个Quaternion实例转换的最⼩夹⾓。
Unity3D 是一个非常流行的游戏开发引擎,它的事件系统是其中一个十分重要的功能。
事件系统可以使得游戏物体之间的通信变得更加简单和灵活,也可以帮助开发者更好地组织和管理游戏逻辑。
本文将详细介绍 Unity3D 中事件的用法,包括事件的类型、如何定义和使用事件以及在不同场景下的具体应用。
一、事件的类型在 Unity3D 中,事件主要分为两种类型:普通事件和Unity事件。
1. 普通事件普通事件是一种自定义的事件,开发者可以根据自己的需求来定义和触发。
普通事件通常通过C#代码来实现,可以用于触发游戏逻辑、UI 界面的交互、与外部系统的通信等各种情况。
2. Unity事件Unity事件是一种由 Unity 提供的内置事件,它们可以与引擎的生命周期和组件的状态相关联。
例如 Update,LateUpdate,FixedUpdate 等生命周期事件,以及 OnMouseDown,OnCollisionEnter,OnTriggerExit 等组件状态事件。
这些事件可以直接在 Inspector 窗口中进行配置和连接,非常方便。
二、定义和使用事件在 Unity3D 中,定义和使用事件主要涉及到委托(Delegate)、事件(Event)和消息传递系统。
下面将分别介绍它们的具体用法。
1. 委托委托是一种类型,它可以存储对方法的引用,使得方法可以像数据一样进行传递和使用。
在事件中,委托通常用于定义事件的类型和签名,以及向事件注册或注销监听者。
例如:```// 定义一个委托类型public delegate void MyEventHandler();// 声明一个事件public event MyEventHandler OnMyEvent;// 触发事件if (OnMyEvent != null){OnMyEvent();}```2. 事件事件是委托的一个特殊用法,它可以用于封装触发和通知的逻辑。
在Unity3D 中,事件通常以公共字段、属性或方法的形式暴露给外部代码,允许外部代码注册和注销事件的监听者。
unity action的用法在Unity中,Action是一种委托类型,用于定义并传递无返回值的方法。
它可以用作回调函数或事件的处理程序。
使用Action,您可以在需要时传递任意数量的参数给方法,然后将其添加到事件中或作为委托调用。
以下是使用Action的一些常见用法示例:1. 作为事件处理程序:```csharppublic Action onButtonClick;// 在某个方法中,添加一个按钮点击事件的处理程序void AddButtonClickHandler(){onButtonClick += OnButtonClick;}// 按钮点击事件的处理程序void OnButtonClick(){Debug.Log("Button Clicked!");}```2. 作为回调函数:```csharp// 定义一个接受两个int类型参数的ActionAction<int, int> onCalculationComplete;// 在某个方法中,执行一个计算操作,并在完成后调用回调函数void PerformCalculation(){int result = 10 + 5;onCalculationComplete?.Invoke(result, 20);}// 在另一个方法中,添加回调函数作为处理程序void AddCalculationCompleteHandler(){onCalculationComplete += OnCalculationComplete;}// 回调函数的处理程序void OnCalculationComplete(int result, int anotherValue){Debug.Log("Calculation Complete! Result: " + result + ", Another Value: " + anotherValue);}```3. 匿名方法:```csharpAction<string> onMessageReceived;void Start(){onMessageReceived += (message) =>{Debug.Log("Received Message: " + message);};// 发送一个消息,触发匿名方法的调用SendMessage("Hello World!");}void SendMessage(string message){onMessageReceived?.Invoke(message);}```请注意,以上仅为示例,您可以根据您的需求和具体情况来使用Action。
unity学习——委托(带参数方法的使用)在Unity中,定义一个带参数的委托非常简单,只需要使用delegate关键字即可。
例如,我们可以定义一个接受一个整数参数的委托如下:```csharppublic delegate void MyDelegate(int value);```接下来,我们可以创建一个方法,它和上面定义的委托具有相同的参数列表:```csharppublic void MyMethod(int value)Debug.Log("Parameter value is: " + value);```为了使用委托来调用这个方法,我们需要先创建委托对象,并将方法赋值给委托。
然后,我们可以像调用普通方法一样调用委托对象:```csharpMyDelegate myDelegate = new MyDelegate(MyMethod);myDelegate(5); // 输出:Parameter value is: 5```正如上面的示例所示,我们可以使用委托对象对方法进行调用,实现了方法的回调。
通过委托,我们可以将方法作为参数传递给其他方法,并在需要的时候进行调用。
在实际开发中,委托的用途非常广泛,尤其是在处理事件时。
例如,当点击一个按钮时触发一个事件,并将按钮的ID作为参数传递给处理方法。
下面是一个简单的示例:```csharppublic delegate void ButtonClickHandler(int buttonID);public event ButtonClickHandler OnButtonClick;public void ButtonClicked(int buttonID)if (OnButtonClick != null)OnButtonClick(buttonID);}public void HandleButtonClick(int buttonID)Debug.Log("Button with ID " + buttonID + " has been clicked");void StartOnButtonClick += HandleButtonClick;ButtonClicked(5); // 输出:Button with ID 5 has been clicked ```在上面的示例中,我们定义了一个ButtonClickHandler委托,它接受一个整数参数。
Unity3D之UGUI学习笔记(⼆):RectTransform与AnchorRect Transform我们都知道,Unity3D中所有的GameObject都必须要携带⼀个Transform组件,且该组件⽆法移除,那么作为UI显⽰的GameObject则不是携带Transform⽽是使⽤Unity3D专门为UI组件设计的Rect Transform组件,如下:另外说⼀下,Canvas Renderer也是UI组件必须携带的组件。
我们来看⼀下其为我们提供的功能:位置位置是以像素为单位,其具体的值则以锚点为准,表⽰和锚点距离,其中x轴从左到右的数值越来越⼤,y轴从下到上的数值越来越⼤,其中的Pos Z和Transform中的position.z效果⼀致,但不是使⽤该值来表⽰UI的深度。
保留该值估计是为了在3D UI的⼀些效果实现上的考虑。
尺⼨不同于缩放,这两个值设置了UI的尺⼨,为负并不会翻转UI⽽是直接不显⽰。
上⾯的两个按钮,上⽅的按钮是设置width为320,下⽅则是将width为160的按钮的scale x设置为2。
旋转效果同Transform,⼀般配合Tween使⽤。
缩放效果同Transform,⼀般配合Tween使⽤。
深度不通过NGUI的深度,在UGUI中的深度完全使⽤树形结构来表⽰,同⼀层级⾥位于下⽅的节点会覆盖掉位于上⽅的节点,如下:修改⼀下树形显⽰列表后如下:AnchorRect Transform除了上⾯提到的功能外,还提供了描点功能,该功能主要实现相对布局的功能。
同时我们还可以⾮常直观的配置描点:锚点描述的是当前UI的⽗对象的位置信息。
⽽锚点则表⽰当前对象坐标的(0, 0)点。
⾮stretch我们可以发现有Left、Center、Right、Top、Middle及Bottom六个设置项,这6个项⽬可以组合出9种形式的锚点,分别对应了当前UI⽗对象的9个⽅向的位置,这样⽅便我们的UI做相对位置的调整,⽐如当UI的坐标为(0, 0),选择CenterMiddle则当前UI为居中状态,⽽选择TopLeft则UI会位于⽗对象的左上⾓。
《Unity 3D 从入门到精通》课程大纲制定人:(教研组组长)(参与)审核人:(专业部主任) (教务科科长)批准人:(分管校领导)一、说明1.课程的性质和内容:Unity3D(简称 U3D):虚拟现实的后起之秀,有前面的几个老大哥引擎的铺垫,U3D一起步就定义为高端大型引擎,且受到业内的广泛关注。
起初只可以运行于 Mac 系统,后来扩展到 Windows 系统了,难能可贵的是他是免费的(对个人不用于商用的范围)U3D自带了不少的工具,方便制作。
互动也是无所不能,但它没什么模块,功能几乎都是基于代码的,画面效果比 Q3D 还好。
另外他可以方便的链接数据库,这样就可以做些多人在线的作品。
总的来说,他跟 VT 一样,可以制作任何领域的作品。
如今,不论是业余爱好者还是开发游戏以及网页、桌面、移动平台和家庭游戏机的交互体验的大型工作室,都在使用 Unity 开发。
为了更好的满足广大 Unity 开发爱好者的需求,天地培训特推出《Unity 从入门到精通》的综合课程。
让你轻松学会 Unity,转眼间,从业余变专业,从小打小闹变成系统科班。
学员学完以后可以从事游戏开发、网站开发、应用开发等工作。
2.课程的任务和要求:1。
在你开始研究任何的三维软件之前,理解你将面对的开发环境是十分必要的.因此,我们的课程将在向你介绍Unity操作界面的知识之前,让你对这些重要的3D概念有良好的认识。
2、从零开始学习c#语言,熟悉Unity3D模型,从创建环境,角色控制器开始,逐渐从开发中了解并认识Unity。
同时学习,数学运算符指定、赋值、比较、逻辑、条件运算符、控制语句与循环语句等编程基础知识.3、深入了解程序逻辑,在游戏项目开发中深入学习并掌握Unity开发中的模型,组件的开发。
包括刚体,Prefab,地形系统,角色控制,交互,触发器,粒子系统,收集、物品栏和HUD, 游戏菜单制作GUITexture和GUI,游戏性能优化等这些unity组件和知识点4、学习使用Unity3d开发2d游戏的技术。
c#委托与事件(详解)⽬录前⾔⼀、声明⽅法⼆、声明委托三、实例化委托四、使⽤委托总结前⾔.NET中的委托是⼀个类,它定义了⽅法的类型,是⼀个⽅法容器。
委托把⽅法当作参数,可以避免在程序中⼤量使⽤条件判断语句的情况。
项⽬名为Test,class类名为Program⼀、声明⽅法在class类中声明⼏个⽅法,以便委托的使⽤。
using System;namespace Test{class Program{/// <summary>/// 返回两个数中较⼤者/// </summary>/// <param name="num1">int类型</param>/// <param name="num2">int类型</param>/// <returns></returns>public static int max(int num1, int num2){return num1 > num2 ? num1 : num2;//如果num1⼤于num2时,就返回num1,否则返回num2}/// <summary>/// 返回两个数中较⼩者/// </summary>/// <param name="num1">int类型</param>/// <param name="num2">int类型</param>/// <returns></returns>public static int min(int num1, int num2){return num1 > num2 ? num2 : num1;//如果num1⼤于num2时,就返回num2,否则返回num1}static void Main(string[] args){}}}⼆、声明委托声明时使⽤delegate关键字来声明委托,委托声明定义了⼀个从System.Delegate类派⽣的类。
Unity3D学习笔记(⼆⼗⼆):ScrollView和事件接⼝昨天问题InputField光标被遮挡问题:背景图⽚输⼊层级⾼于光标的层级,把光标弄成⼦物体,⼦物体层级⾼⾃制的滑动框,选项怎么对齐,把Template的Pivot.y改为1分辨率的区别:16:9和1920x108016:9,屏幕像素按⽐例缩放,⽂本会变模糊1920x1080,屏幕像素是固定的Canvas Group:控制⼀组UI的某些属性(所有⼦物体的UI组件的属性)Alpha:改变所有⼦物体的透明通道,0不显⽰,1显⽰Interactable:改变所有⼦物体的交互状态,可交互,不可交互Blocks Raycasts:改变所有⼦物体的射线检测,接受射线检测,不接受射线检测Ignore Parent Group:是否忽略⽗物体的Canvas Group的影响登录界⾯的淡⼊淡出效果Panel组件(少⽤)作⽤:背景图或⽗物体ScrollView组件(拖动框)Content:可拖动的物体,改变image的⽗物体Content的坐标Horizontal、Vertical:是否可以⽔平、垂直拖动Movement Type:移动类型----Elastic:回弹原位,会⾃动回到对齐的位置--------Elasticity回弹系数,值越⼤回弹越慢----Unrestricted:⾃由拖动,⽆限制,拖到哪就是哪----Clamped:有限制的,拖动物体的拖动框最多能跟视窗对齐,⽗物体边缘限制在视窗边缘Inertia:惯性----Deceleration Rate:惯性的衰减系数,0相当于没有惯性,1Scroll Sensitivity:⿏标滚轮的滚动系数Viewport:视窗,如果未指定,则视窗默认为ScrollRect的范围Horizontal ScrollBar:⽔平滚动条----Visibility:显⽰⽅式--------Permanent:永久显⽰--------Auto Hide:⾃动隐藏--------Auto Hide And Expand Viewport:⾃动隐藏并且扩展视窗Vertical ScrollBar:垂直滚动条Mask遮罩:图⽚圆形显⽰遮罩依赖于Image图⽚形状,必须与Image⼀起使⽤,否则⽆效Show Mask Graphic:是否显⽰遮罩的图⽚Viewport⾥的遮罩⾃制拖动框综合练习-拖动框Hrizontal Layout Group:⽔平⾃动布局组件(对⾃⼰的⼦物体)Padding:距离四个边缘的间距,距离四个变量的距离Spacing:各个元素之间的间距Child Alignment:⼦物体的对齐⽅式Child Control Size:----Width:是否强⾏扩⼤⼦物体的宽度,来填补额外的可⽤空间----Height:是否强⾏扩⼤⼦物体的⾼度,来填补额外的可⽤空间----勾选后,⼦物体的宽⾼会变成不可编辑Child Force Expand:是否强⾏扩⼤物体间的横向间隔,来填补额外的可⽤空间Movement Type - Clamped:需要在Content的长度⽐Viewport⼤的情况下才可以拖动可以使⽤⾃动扩容组件,给Content动态添加长度Content Size Fitter(⾃动扩容组件)Horizontal Fit:⽔平⾃动扩容----Unconstralned:不需要⾃动扩容----Min Size:最⼩值----Preferred Size:最合适的值(常⽤)⼀般情况下,需要和⾃动布局组件或Text组件⼀起使⽤⾃动扩容后,宽⾼变为不可修改名称显⽰代码操作using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class SelectUI : MonoBehaviour {public Text nameText;public string playerName;private Toggle toggle;// Use this for initializationvoid Start () {toggle = GetComponent<Toggle>();toggle.onValueChanged.AddListener(OnValueChanged);}// Update is called once per framevoid Update () {}void OnValueChanged(bool isOn){Debug.Log("OnValueChanged");nameText.text = isOn ? playerName : "";}}UGUI事件接⼝命名空间:using UnityEngine.EventSystems;继承了UGUI事件接⼝的类,挂载物体上,只要⼦物体或⾃⼰本⾝能接受射线检测,接⼝就是可以执⾏的。
实验报告:unity part2
实验人:
实验目的:深入掌握使用unity 3D,完成太空战争小游戏
实验内容:Player:发射子弹,首先在层次窗口中创建一个子弹模型capsule,当按下Space空格键时,发射子弹。
子弹:向上移动
碰撞到enemy,则二者销毁。
若没有碰撞到,且超出上边界时,也应
当销毁
碰撞
GUI显示:显示miss数目
实验结果:完成了实验要求内容。
并且能够实现多个enemy同时下落,在屏幕中显示剩余生命值,enemy和player进行了颜色美化设计。
此外还设
计了让enemy的每个大小不同以及player能够在同一水平线上循环
出现,失去一条生命值后1.5秒后出现。
实验代码和实现截图:
碰撞代码在实验报告1中已经展示
子弹:
GUI显示信息:
在同一水平线上循环出现:
整体实现效果:(enemy大小不一样)
实验心得:在经历过实验1后,此次实验深入使用了unity 3D,代码实现需要的函数更多,我们也需要更多地了解。
实验过程中较为简单的有在GUI
显示等内容,只需要对player进行设置即可,GUI的代码也很容易获
得。
真正容易出现问题的是子弹的设置。
不同于enemy和player的
直接添加,子弹需要调用perfab,所以需要进行更多的设置才能使其
和player位置同步发射,具体实现可见工程文件。
Unity 3D是个拥有丰富内容的软件,在使用过程中除了像普通面向客
户软件一样了解各个选项功能外,还要具备一定编程能力,相信以后
可以用它学习到更多!。
1.unity简介和安装(x)2.unity基础操作unity窗口界面介绍1.Scene场景编辑窗口(Q、W、E、R、T/按住鼠标右键—旋转视角、按住鼠标右键Q、E、W、S、A、D)2.Game游戏运行窗口(运行按钮,暂停按钮,下一帧画面)3.Hierarchy 场景物体列表窗口(三角符号表示物体间的父子关系)4.Project 项目资源列表窗口(与文件夹对应,mete文件,移动尽量在unity中移动而不是在文件夹中移动,可能报错)5.Inspector 属性编辑列表窗口(选中Hierarchy物体,出现物体相关属性)6.Console 控制台输出窗口7.其他常用窗口:Layers(层)2by3(显示模式)unity菜单界面介绍1.file 文件菜单2.edit 编辑菜单3.Assets 资源菜单4.Gameobject 物体资源菜单ponent 组件菜单6.Window 窗口菜单7.Help 帮助菜单Scene与场景漫游1.Scene窗口各项工具Q、W、E、R按住鼠标右键Q、W、E、RPivot 物体自己的中心/center 所有物体加权之后的中心Global 世界坐标/local 自身坐标Textured Wite/render Paths显示2D/3D2.快捷键与视角的移动Hierarchy与场景搭建1.Gameobject: 基本组件gameobject—>create other2.Gameobject: 灯光组件3.Gameobject: 物体组件4.Gameobject:其他组件5.Hierarchy层级关系与应用6.场景搭建案例Project与资源管理Inspector与游戏组件3.C#语言基础C#的值类型C#的引用类型C#的类型转换C#的逻辑语句C#的集合类型C#的面向对象特性封装、继承、多态Unity 协程:和线程的区别:没有异步同步的概念,每一帧都执行(有内容的情况);协程的作用:1)延时(等待)一段时间执行代码;2)等某个操作完成之后再执行后面的代码。
Unity面试必备知识本文将介绍Unity面试中常见的必备知识点,帮助读者更好地准备和应对Unity相关的面试问题。
1. 游戏开发基础知识在面试中,面试官通常会问到一些游戏开发的基础知识,包括游戏开发流程、游戏设计原理、游戏引擎的概念等。
以下是一些常见的问题和答案:问题1:游戏开发流程是什么?答:游戏开发流程通常包括需求分析、游戏设计、游戏开发、游戏测试和发布等阶段。
需求分析阶段主要是确定游戏的目标和要求;游戏设计阶段是根据需求分析确定游戏的规则、玩法和界面设计;游戏开发阶段是根据设计文档进行编码和制作;游戏测试阶段是检查游戏的功能和性能;发布阶段是将游戏上线或者发布到相应的应用商店。
问题2:什么是游戏引擎?答:游戏引擎是一种开发工具,用于简化游戏开发过程中的重复性工作。
它提供了一系列的功能和工具,例如图形渲染、物理模拟、碰撞检测、动画控制等。
使用游戏引擎可以节省开发时间和成本,提高游戏开发效率。
2. Unity基础知识Unity是一款广泛使用的游戏引擎,熟悉Unity的基本知识对于面试非常重要。
以下是一些常见的Unity基础知识点:问题1:什么是GameObject?答:在Unity中,GameObject是游戏中的基本实体。
它可以表示角色、道具、场景中的物体等。
GameObject可以添加组件,例如碰撞器、刚体、脚本等,来实现不同的功能。
问题2:什么是场景(Scene)?答:场景是Unity中的一个概念,用于描述游戏中的一个环境或者关卡。
一个游戏可以包含多个场景,每个场景可以包含多个GameObject。
场景可以通过加载和切换来实现游戏的流程和进度控制。
问题3:什么是组件(Component)?答:在Unity中,组件是GameObject的一部分,可以为GameObject提供不同的功能。
常见的组件包括碰撞器、刚体、动画控制器、脚本等。
组件可以通过添加、移除和修改来改变GameObject的行为。
实验2 三维建模工具Unity 3D本章将通过创建对象、添加脚本、控制相机跟随、旋转对象、碰撞检测、显示文本和发布程序七个实验来对三维建模工具Unity 3D游戏建模过程中的场景、Plane、Sphere、Cube 对象、脚本、碰撞检测、UI以及程序发布等问题进行学习和练习。
在实验最后列出了Unity 3D的各个菜单栏以及它们所包含的下拉菜单及其译名。
实验2.1 创建对象实验目的1.掌握在Unity 3D中创建项目、场景、Plane和Sphere等。
2.掌握在Unity 3D中材质的应用。
实验要求学会在Unity 3D中创建项目、场景、Plane和Sphere,学会材质的应用。
实验内容【实验2-1】创建PlayBall小球吃金币游戏项目,创建地面和小球。
操作步骤:1)新建项目,依次输入项目名称,选择项目存储路径,如图2-1所示。
图2-1 新建Unity 3D项目2)点击“Create project”创建项目进入Unity 3D界面,右上角“Layout”可修改布局,Unity 3D有多种布局,读者可以根据自己的习惯选择,下图为“Layout”| “Tall”布局,本实验截图均为Tall布局,如图2-2所示。
图2-2 Unity 3D中Tall布局3)在“Project”窗口中新建文件夹Scenes,存储游戏场景,按“Ctrl+S”存储当前游戏场景main,如图2-3所示。
图2-3 新建Scenes文件夹4)在“Hierarchy”窗口中创建游戏地面,右键选择“3D Object”|“Plane”,因为其为游戏地面,将其命名为Ground,如图2-4所示。
图2-4 新建Plane对象5)选中Ground对象,在“Inspector”窗口的“Transform”右侧的齿轮选择“Reset”,将地面对象放置在坐标系原点,如图2-5所示。
图2-5 选择Reset6)若想修改该地面对象表面颜色,需要为其添加材质。
废话就不多说了,直接进入今天的主题-事件在我们所接触到的事件一般分两种:一种是自定义的,自定义的事件需要自己对其进行赋值。
一种是控件提供方定义的,如:ngui,控件事件只需要查找控件定义的事件列表,选择所需要的进行操作即可。
当然,我们的话题是上面第一种啦。
实例模拟场景为:文章来自【狗刨学习网】游戏战斗中,猪脚在指定的一片区域中,存在4只怪物,他的目的就是一只一只找到并消灭该区域的怪物。
简易流程:查询目标->行走->攻击,依次循环ok,在此,我用代码快速模拟这样一个情景,建立一个Hero类,如下:using UnityEngine;using System.Collections;using System.Collections.Generic;using System;// 英雄角色public class Hero : MonoBehaviour{//当前目标idpublic int TargetID=0;public List<int> ListMonster;void Start(){InvokeRepeating("selectTarget", 0.3f, 0.3f); }// 查询目标private void selectTarget(){if (TargetID==0){if (ListMonster.Count > 0){for (int i = 0; i <= ListMonster.Count; i++) {TargetID = ListMonster[i];[/i] WalkToTarget(TargetID);Atk(TargetID,i);break;}}else{Debug.Log("恭喜随风去旅行为名除害成功,获得荣誉称号“为民除害”");CancelInvoke("selectTarget");}}}private void WalkToTarget(int id){Debug.Log(String.Format("朝目标{0} 移动,幸运触发了缩地成寸,到达攻击区域内..:", id));}private void Atk(int id,int itemNum){Debug.Log(String.Format("向目标{0}发动猛烈的攻击,幸运触发一击必杀,成功杀死了目标{1}:", id,id)); ListMonster.RemoveAt(itemNum);TargetID = 0;}}注:仅仅为了指导一个思想,真正战斗逻辑代码肯定不是这样的,好多东西我都直接文字描述代过了,毕竟今天主题不是这个。
好了,接下来绑定代码到任何对象,设置怪物个数运行如下:行了,上面代码虽然完成了所描述的功能,可是这样代码质量很差的,如果策划那天来些奇葩需求,如:我要人物可以飞着移动,我要攻击的时候打个降龙十八掌等等那么,说不定第二天又有新闻某某公司程序通宵加班,猝死。
为了防止善变的策划,那我们在做东西的时候就得聪明一点了,那又应该如何来写呢?先埋个伏笔,先来说说今天的主题事件事件是什么?对代码有什么用?又该如何使用?让我们一起带着疑问往下走,首先,我还是得先谈谈委托,委托事件委托事件,从字面意思就可看出委托是事件的基础,也有一种说法事件是特殊化的委托。
委托:使用委托可以将方法应用(不是方法)封装在委托对象内,然后将委托对象传递给调用方法的代码,这样编译的时候代码就没有必要知道调用哪个方法。
通过使用委托程序能够在运行时动态的调用不同的方法。
具体实现见《【unity 代码升华篇】委托、事件全解析(一)》。
事件:在此要分2个部分来说,暂叫它们为事件发行者、事件接收者。
事件发行者:指对象自身状态信息发送变动时,就触发一个事件,并通知事件接收者发生了一个操作。
就如生活中我们常常面对的策划,某天突然找到你说需求发生了改变,呵呵...苦逼的程序也只有呵呵面对了。
(趁机黑下策划)事件接收者:指接收到事件发行者的消息后,通常需要提供一个事件处理的方法,在事件发行者触发一个事件后,会自动执行这个方法。
这就是生活中程序要干的事情了..以下为事件处理机制模型:简单来讲:就是说当一个结果发生时,有可能引起另外的一些反应,就好比佛家常说的因果关系,而事件,就是这个因果关系的内部联系。
在此还有个东西有必要提下,Observer 设计模式,主要包括如下两类对象1.Subject:监视对象,它往往包含着其他对象所感兴趣的内容。
在本范例中,角色的目标就是一个监视对象,它包含的其他对象所感兴趣的内容,就是Targetid字段,当这个字段的值变为0时,会把数据发给监视它的对象。
2.Observer:监视者,它监视Subject,当Subject 中的某件事发生的时候,会告知Observer,而Observer 则会采取相应的行动。
在本范例中,Observer 有查询和行走,它们采取的行动分别是查询目标和向目标移动。
好了,事件基本含义了解了,下面通过5个步骤用代码实例进行一次深入探讨:1.声明事件(定义事件).2.注册事件 .3.实现事件.4.触发事件.5.为事件增加“添加/删除”方法.一、声明事件(定义事件)首先,要建立委托,格式为:public delegate void 委托名(object sender, EventArgs e);1.对象:sender2.参数:object sender: 指触发对象(如:Button).EventArgs e :则为引发这个事件的原因,包含了Observer 所感兴趣的数据,在本例中是Targetid.委托名一般格式是:名字+EnvenHandle。
这样取名比较规范。
如下://定义委托,它定义了可以代表的方法的类型public delegate void TestEnvenHandle(object sender, testEventArgs e);/// <summary>/// 定义testEventArgs 类,传递给Observer 所感兴趣的信息/// </summary>public class testEventArgs : EventArgs{public readonly int TargetID;public testEventArgs(int _TargetID){this.TargetID = _TargetID;}}然后,建立一个事件字段:public event 委托类型事件名;注意:event关键字代表事件,返回类型为委托如://===================//用event关键字声明事件对象public event TestEnvenHandle testEvent;//===================再定义一个方法,处理事件,再本例中为OnTargetChange (EventArgs e),使用virtual 的方法供内部的代码调用,接收一个testEventArgs 对象,这个对象包含要传递给消息接收方的一些信息// 可以供继承自 Hero 的类重写,以便继承类拒绝其他对象对它的监视protected virtual void OnTargetChange(testEventArgse){//任何注册到事件的方法,通知它们if (testEvent != null){testEvent(this, e); // 调用所有注册对象的方法}}最后还要创建触发事件的方法。
例子中为selectTarget(),在其方法中,当条件满足则调用OnTargetChange 来达到触发事件的目的。
// 查询目标public void selectTarget(){for (int i = 0; i <= Caching.ListMonster.Count; i++){Caching.itemNum = i;//建立testEventArgs 对象。
testEventArgs e = newtestEventArgs(Caching.ListMonster);// 调用 OnTargetChange 方法OnTargetChange(e);break;}}再使用事件时,通常要定义两个方法,一个是和事件定义的委托签名一致的方法,在本例中分为,朝目标行走// <summary>/// 普通行走/// </summary>/// <param name="sender"></param>/// <param name="e"></param>public static void WalkToTarget(System.Objectsender, Select.testEventArgs e){//访问 sender 中的公共字段Debug.Log(System.String.Format("朝目标{0} 移动,幸运触发了缩地成寸,到达攻击区域内..:", e.TargetID));}攻击目标//一击必杀public void AtkToTarget(System.Object sender,Select.testEventArgs e){Debug.Log(System.String.Format("向目标{0}发动猛烈的攻击,幸运触发一击必杀,成功杀死了目标{1}:",e.TargetID, e.TargetID));Caching.ListMonster.RemoveAt(Caching.itemNum);}运行修改后的代码:ok,完全没问题,修改后的代码我就不贴出来了,我放百度云需要的大家自己去下载哈后面总结得有些乱,附上源码大家可以对照看,都有详细注释,方便大家更容易理解。
通过使用事件方式,代码真变得整洁很多,方便管理而且可扩展性超强哟,希望大家看后也能在代码方面有更好的提升,。