【Unity 3D】学习笔记二十七:unity游戏脚本(七)

2024-09-03 11:48

本文主要是介绍【Unity 3D】学习笔记二十七:unity游戏脚本(七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用C#编写游戏脚本


在前面提到,unity支持三种语言编写脚本:js,C#,boo。入门的时候建议只用js,因为js比较简单易懂,语法也不是很严格。但后来晋级的时候推荐使用C#,因为它比较符合unity的编程思想,执行效率更高。下面总结下怎么使用C#编写脚本。


继承MonoBehaviour类

在unity中,任何一个脚本,包括上述三种语言都需要去继承MonoBehaviour这个类。为什么我们之前写JS代码的时候没有继承咧?因为在创建JS代码的时候,系统会将其类名与继承关系隐藏起来。

在project视图中创建一个JS脚本,打开会发现如下代码:

#pragma strictfunction Start () {}function Update () {}
系统自动的帮我们生成Update方法。在JS中是不存在void类型的方法的,需要使用function作为关键字。


创建一个C#代码,打开后:

using UnityEngine;
using System.Collections;public class NewBehaviourScript : MonoBehaviour {// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {}
}
在C#脚本中,系统已经帮我们生成对应的继承关系public class NewBehaviourScript : MonoBehaviour

在绑定C#脚本时,必须保证它的名称与项目资源视图中该脚本名称对应,不然无法绑定。


声明变量

在JS中,声明变量都需要使用var关键字,并在变量后面添加“ :”以及具体对象类型与数值。C#则使用对象类型加变量名的方式。

JS:

public var i : int = 0;

var name : String[ ] = ["test","test1","test2"];

var obj : GameObject;

C#:

public int  i = 0;

var String[ ]name = ["test","test1","test2"];

var  GameObject obj ;



调用方法

在编写代码的时候调用方法是非常常见的,因为不可能所有的代码都写在同一个方法中,这样的代码是非常不合理且不应该。JS和C#在调用方法上也有不同:

JS

text01.js:

//整型
var i : int;
//浮点型
var f : float;
//布尔型
var b : bool ;
//字符串
var str : string ;//设置整形
function setInt(int temp : int){i = temp;
}//设置浮点型
function setFloat(temp : float){f = temp;
}//设置布尔型
function  setBoolean(temp : bool){b = temp;
}//设置字符串
function  setString(temp : string){str = temp;
}//获取整形
function getInt() {return i;
}//获取浮点型
function getFloat(){return f;
}//获取布尔型
function getBoolean() {return b;
}//获取字符串
function getString() {return str;
}

main,js:

var obj : GameObject;function Start(){obj = GameObject.find("cube");var script : text0 = obj.GetComponent("text0");script.setInt(100);script.setFloat(10.0f);script.setBoolean(true);script.setString("test");Debug.Log(script.getInt());Debug.Log(script.getFloat());Debug.Log(script.getBoolean());Debug.Log(script.getString());
}

C#:

text01,cs.

using UnityEngine;
using System.Collections;public class Test1 : MonoBehaviour {//整型int  i;//浮点型float f;//布尔型bool b;//字符串string str;//设置整形
public void setInt(int temp){i = temp;
}//设置浮点型
public  void setFloat(float temp){f = temp;
}//设置布尔型
public void  setBoolean(bool temp){b = temp;
}//设置字符串
public void  setString(string temp){str = temp;
}//获取整形
public int getInt() {return i;
}//获取浮点型
public float getFloat(){return f;
}//获取布尔型
public bool getBoolean() {return b;
}//获取字符串
public string getString() {return str;
}}


main,cs:

using UnityEngine;
using System.Collections;public class Main : MonoBehaviour {//立方体对象GameObject obj ;// Use this for initializationvoid Start () {//获取立方体对象	obj = GameObject.Find("Cube");//获取Test1脚本Test1 script = obj.GetComponent<Test1>();//设置整形script.setInt(100);//设置浮点型script.setFloat(10.0f);<pre name="code" class="javascript">
function OnGUI()
{if(GUI.Button(Rect(100,50,200,100),"JavaScript调用C#")){//获取C#脚本对象var cs = this.GetComponent("CS_test"); //脚本C#脚本中方法cs.CallMe("我来自JavaScript");}}function CallMe(test : String)
{Debug.Log(test);
}

//设置布尔型script.setBoolean(true);//设置字符串script.setString("Test");//获取信息并且打印Debug.Log(script.getInt());Debug.Log(script.getFloat());Debug.Log(script.getBoolean());Debug.Log(script.getString());}}

 

其实细细品味下,JS和C#代码之间并没有非常大的变化,只是相关的关键字与格式有所不同而已。相信有JAVA学习的经验学习C#不是很难。记得老师曾经说过:计算机编程语言发展到现在,大部分的语言之间其实都是相互借鉴的,因此都是非常类似。只要你学好了里面的一种,其他的语言很容易就能上手。


JS与C#脚本之间的通信

在unity官方文档中,JS或者C#实现的脚本功能是完全相等的,不存在这个功能用JS实现比C#好这种说法。但在实际中,难免会遇见两种脚本来编写游戏。此时就需要他们之间进行通信了。

JS_test.js


function OnGUI()
{if(GUI.Button(Rect(100,50,200,100),"JavaScript调用C#")){//获取C#脚本对象var cs = this.GetComponent("CS_test"); //脚本C#脚本中方法cs.CallMe("我来自JavaScript");}}function CallMe(test : String)
{Debug.Log(test);
}

CS_test.cs

using UnityEngine;
using System.Collections;public class CS_test : MonoBehaviour {void OnGUI(){if(GUI.Button(new Rect(100,170,200,100),"C#调用JavaScript")){//获取JavaScript脚本对象JS_test jsScript = (JS_test)GetComponent("JS_test");//调用JavaScript脚本中方法jsScript.CallMe("我来自C#");}}public void CallMe(string test){Debug.Log(test);}
}

运行:


点击后:


本例得注意一点,得将JS_test和CS_test都绑定在摄像机上,而且JS脚本得放在新建的Standard Assets文件夹中,否则无法编译。


这篇关于【Unity 3D】学习笔记二十七:unity游戏脚本(七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1132888

相关文章

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

bat脚本启动git bash窗口,并执行命令方式

《bat脚本启动gitbash窗口,并执行命令方式》本文介绍了如何在Windows服务器上使用cmd启动jar包时出现乱码的问题,并提供了解决方法——使用GitBash窗口启动并设置编码,通过编写s... 目录一、简介二、使用说明2.1 start.BAT脚本2.2 参数说明2.3 效果总结一、简介某些情

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert