Unity中的C#编程

256 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。​

Unity中的C#编程 112-116\

.NET dotent简介\


Microsoft新一代多语言的开发平台,用于构建和运行应用程序
\

C# \


Microsoft 专为.NET推出的高级语言


##Mono

NOvell公司支持在其他操作系统下开发.NET程序的框架


Unity借助Mono实现跨平台,核心是.NET Framework 框架

------

脚本是附加在游戏物体上用于定义游戏对象行为的指令代码,就是.cs的文本文件,也就是类文件。   附加到游戏物体中,定义游戏对象行为指令的代码。

Unity支持三种高级编程语言:

C#,javaScript和Boo Script
\

语法结构\


using 命名空间(避免类的重名);
public class 类名:MonoBehaviour
{
void 方法名()
{
Debug.Log("显示调试信息");
print("本质就是Debug.Log方法");
}
}

- 文件名与类名必须一致(不一致就会导致编译失败)
- 写好的脚本必须附加到物品上才执行
- 添加到游戏物体的脚本类必须从MonoBehaviour类继承


在Unity中通过菜单设置修改默认的脚本编辑器:(Unity和vs没有连上的话可以修改这个)

Edit -> Preferences -> External Tools -> External Script Editor
\

脚本的生命周期\


就是 Unity 脚本从唤醒到销毁的过程。也叫必然事件,也叫消息。

如果在编码过程中出现“不一致的行尾提示框”的话,直接点 “是” 就行了。

//序列化字段  作用:在编辑器中显示私有变量,想让别人看到,又不想让别人修改
[SerializeField]
private int a = 100;

//作用:在编辑器中隐藏字段,不希望你在编辑器里修改它,别人能够修改,但是又不想让别人看到他
[HideInInspector]
public int b;

//作用:设置范围
[Range(0,100)]
public int c;

不要在脚本里面写构造函数



- Awake 唤醒: 当物体载入时立即调用一次;常用于在游戏开始前进行初始化,可以判断当满足某种条件执行此脚本 this.enable=true.


- OnEnable 当可用: 每当脚本对象启用时调用


- Start 开始:物体载入且脚本对象启用时被调用1次,常用于数据或者游戏逻辑初始化,执行时机晚于Awake


- FixedUpdate 固定更新:脚本启用后,固定时间被调用,适用于游戏对象做物理操作,例如移动等。

↑设置更新频率: Edit -> Project Setting -> Time -> Fixed Timestep值,默认为0.02S

- OnCollisionXXX碰撞: 当满足碰撞条件时调用。
- OnTriggerXXX触发:当满足触发条件时调用。
- Update 更新:脚本启用后,每次渲染场景时调用,频率与设备性能及渲染量有关
- lateUpdate 延迟更新:在Update函数被调用后,适用于跟随逻辑。 
输入事件↓
- OnMouseEnter 鼠标移入:鼠标移入到当前Collider时调用
- OnMouseOver 鼠标经过:鼠标经过当前Collider时调用
- OnMouseExit 鼠标离开:鼠标离开当前Collider时调用
- OnMouseDown 鼠标按下:鼠标按下当前Collider时调用
- OnMouseUp 鼠按抬起:鼠标在当前Collider上抬起时调用
场景渲染↓
- OnBecameVisible 当可见: 当Mesh Renderer 在任何相机 可见时调用
- OnBecameInvisible 当不可见:当Mesh Renderer 在任何相机上都不可见时调用
结束阶段↓
- OnDisable 当不可用:对象变为不可用或附属游戏对象非激活状态时此函数被调用
- OnDestory 当销毁:当脚本销毁或附属的游戏对象被销毁时被调用
- OnAppliacationQuit 当程序结束:应用程序退出时被调用

public class Demo01 : MonoBehaviour
{
// Start is called before the first frame update
public int a = 100;

public int A
{
get
{
return this.a;
}
set
{
this.a = value;
}
}

//*初始阶段

//Awake的执行时机:创建游戏对象,立即执行   永远是Awake先执行,Start后执行
//作用:初始化

private void Awake()
{

// Debug.Log("Awake--" + Time.time+this.name);
}
//Start的执行时机:创建游戏对象,脚本启用之后,才执行
//作用:初始化
private void Start()
{
Debug.Log("Start--" + Time.time+this.name);
}
//物理阶段

//FixedUpdate固更新的执行时机:每隔固定时间执行一次。(时间可以修改)
//适用性:适合对物体做物理操作(移动、旋转。。。。。),不会受到渲染的影响
private void FixedUpdate()
{//渲染时间不固定(美珍渲染量不同、机器性能不同)
Debug.Log(Time.time);
}
//Update执行时机:渲染帧执行.执行间隔不固定
//适用性:处理游戏逻辑
private void Upadate()
{

}

}
\

B站117-121\


--------------------------------------------119节  调start Update

调试过程中,输入代码:

- 右键->快速监视   
- 查看“即时窗口”

*单帧调试:*启动调试;运行场景;暂停游戏;加断点;单帧执行

----------------------------------------------120节 Unity编程中常用的类

1. 脚本里面的this就是脚本挂载物体的引用
2. transform是类,老祖宗里面有
3. transform里面有position属性




-----测试用例代码

private void OnGUI()
{
if (GUILayout.Button("你好"))
{
this.transform.position = new Vector3(0, 1, 0);
//this:脚本挂载的物体 GetComponent<>():是个类  MeshRnderer:是类的引用
this.GetComponent().material.color = Color.black;

}
}


-----------------------------------------------------121节   Componen组件

- 看视频的过程中发现代码有 var ,查了一下。    var可以理解为匿名类型,要求是局部变量,它主要用于在声明变量时,无法确定数据类型时使用。
- 还有一个 foreach ,看了他的用法相当于循环

举例:

int sum = 0;
foreach(int i in Array)
{
sum=sum+j;
}

-----获取当前所有的组件

//获取当前所有组件
if (GUILayout.Button("GetComponent"))
{
var allComponent = this.GetComponents();
foreach(var item in allComponent)
{
Debug.Log(item.GetType());
}
}


-----获取后代物体的指定类型文件(这个没太懂,跟视频讲的不一样 ............ps:懂了,因为我的子物体是直接复制的,所以复制出来的子物体上面有和父物体一样的代码,导致结果和视频上不一致)

//获取后代物体的指定类型组件
if (GUILayout.Button("GetComponentsInChildren"))
{
var allComponent = this.GetComponentsInChildren();
foreach(var item in allComponent)
{
item.material.color = Color.red;
}
}

Component类提供了查找(在当前物体、后代、先辈)组件的功能


----------------------------------------------------122节 Transform组件

-----如果想得到物体的子物体,可以采用这种方法

if (GUILayout.Button("foreach--transform"))
{
foreach(Transform child in this.transform)
{//child为每个子物体的变换组件
print(child.name);
}
}