Unity3D笔记 英保通三 脚本编写 、物体间通信
一、脚本编写
1.1、同一类型的方法JS和C#的书写方式却不一样主要还是语法,在工程中创建一个Cube 分别把JSTest.js和CSharp.cs 添加到Cube中
JSTest.js
#pragma strict private var i:int; private var f:float;
function Start () { } function Update () { } function SetInt(_i:int)
{
i=_i;
}
function SetFloat(_f:float)
{
f=_f;
} function GetInt():int
{
return i;
} function GetFloat():float
{
return f;
}
CSharp.cs
using UnityEngine;
using System.Collections; public class CSharpTest : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () { } int i;
float f; public void SetInt(int i)
{
this.i = i;
}
public void SetFloat(float f)
{
this.f = f;
} public int GetInt()
{
return i;
} public float GetFloat()
{
return f;
}
}
1.2、JS,C#调用方法赋给Main Camera
MainJS.js
#pragma strict var obj:GameObject;
function Start () {
obj=GameObject.Find("Cube"); var js:JSTest=obj.GetComponent(JSTest); js.SetInt(1);
js.SetFloat(1.1); print("JS GetInt :"+js.GetInt()); print("JS GetFloat:"+js.GetFloat());
} function Update () { }
MainCharp.cs
using UnityEngine;
using System.Collections; public class MainCSharp : MonoBehaviour { GameObject obj;
// Use this for initialization
void Start () {
obj = GameObject.Find ("Cube");
CSharpTest cs = obj.GetComponent<CSharpTest> ();
cs.SetInt ();
cs.SetFloat (11.11f); Debug.Log ("C# GetInt "+cs.GetInt()); Debug.Log ("C# GetFloat "+cs.GetFloat ());
} // Update is called once per frame
void Update () { }
}
1.3、看看结果

结果有点意外:JS应该先执行,为什么出来的顺序是这个?
"Standard Assets"、 "Pro Standard Assets" 和 "Plugins" 这三个目录里的脚本被最先编译,"Editor"目录里的稍后编译,其他的脚本最后编译。
二、物体间通信
2.1、
GameObject.SendMessage:向自身的脚本中发送消息
GameObject.BroadcastMessage:向自身及子物体的脚本中发送消息
GameObject.SendMessageUpwards:向自身及父物体中发送消息(先发给自己在发送给其他物体)
例如:子类Sphere对应脚本sendMessage.cs 父类Cube对应脚本receiveMessage.cs
sendMessage.cs
using UnityEngine;
using System.Collections; public class sendMessage : MonoBehaviour { // Use this for initialization
void Start () {
gameObject.SendMessageUpwards("SendMsgParent", "Hello 来自子类Sphere");
} // Update is called once per frame
void Update () { } void SendMsgParent(string msg)
{
Debug.Log("我是子类Sphere,子类发来的消息:" + msg);
}
}
receiveMessage.cs
using UnityEngine;
using System.Collections; public class receiveMessage : MonoBehaviour
{ // Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{ } void SendMsgParent(string msg)
{
Debug.Log("我是父类Cube,子类发来的消息:" + msg);
}
}
最终结果

发送消息:先发送给自己在发送给其他物体
2.2、上面有个缺陷就是必须是继承关系 方可传递消息
解决方案:可以用C# 委托和事件机制来改变,可以实现不同物体间的进行消息传递
步骤:新建两个GameObject :EventCube、ListenCube 做事件和监听。对应分别的cs文件EventCube.cs、ListenCube.cs
EventCube.cs
using UnityEngine;
using System.Collections; public class EventCube : MonoBehaviour { public delegate void EventHandle(GameObject e); public event EventHandle MouseOver; void OnMouseOver()
{
if (MouseOver != null)
{
MouseOver(gameObject);
} }
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () { }
}
ListenCube.cs
using UnityEngine;
using System.Collections; public class ListenCube : MonoBehaviour
{ // Use this for initialization
void Start()
{
EventCube ev = GameObject.Find("EventCube").GetComponent<EventCube>();//EventCube 事件物体
ev.MouseOver += new EventCube.EventHandle(ev_MouseOver);//监听函数
//ev.MouseOver += ev_MouseOver;
} void ev_MouseOver(GameObject e)
{
this.transform.Rotate(, , );
Debug.Log("旋转 :" + e);
//throw new System.NotImplementedException();
} void Listening(GameObject e)
{ } // Update is called once per frame
void Update()
{ }
}
效果:

Unity3D笔记 英保通三 脚本编写 、物体间通信的更多相关文章
- Unity3D笔记 英保通八 关节、 布料、粒子系统
一.关节1.1..链条关节 Hinge joint :他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力 1.2.. ...
- Unity3D笔记 英保通四 虚拟轴应用及键盘事件
Input: 1.使用这个类能够读取输入管理器设置的按键,以及访问移动设备的多点触控或加速感应数据.想要读取轴向使用Input.GetAxis方法获取下列默认轴: "Horizontal&q ...
- Unity3D笔记 英保通一
一.材质和着色器 1.材质和着色器紧密的联系,其中材质相当于是一个框架,而着色器就是框架中中的内容.在材质框架中可以选择不同的Shader并调节不同的 属性 Material和Physic Mater ...
- Unity3D笔记 英保通二
一.访问另一个物体 1.代码中定义一个public的物体 例如:var target:Transform; 在面板上直接拖拽一个物体赋值给target 2.通过GameObject.Find(&quo ...
- Unity3D笔记 英保通十 射线碰撞器检测
射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...
- Unity3D笔记 英保通九 创建数
Unity中创建树:可以直接通过程序自动来创建树木还可以手动创建树木(本质上在我看来就是给程序自动创建的树动动”小手术“) 一.程序自动创建树木 3.1.层次视图中创建:一个平行光.摄像机.地.数并且 ...
- Unity3D笔记 英保通七 物理引擎
给球体添加刚体RigidBody和球体碰撞器Sphere Collider 效果: OnTriggerEnter() 代码 using UnityEngine; using System.Collec ...
- Unity3D笔记 英保通六 角色控制器
一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...
- Unity3D笔记 英保通五 鼠标事件与GUI系统双击检测
一.如何使用GUI事件来检测鼠标是否按下的事件: 获取当前事件:var e:Event=Event.current: using UnityEngine; using System.Collectio ...
随机推荐
- 升级到yosemite后homebrew报错的解决
报错会如下: /usr/local/bin/brew: /usr/local/Library/brew.rb: /System/Library/Frameworks/Ruby.framework/Ve ...
- 【Postgresql】use
http://www.jianshu.com/p/0ed65e630fd0 http://www.linuxidc.com/Linux/2013-12/94354.htm tag 是一个Array字段 ...
- linux echo命令提示权限不够的解决办法
该文章转载于此:http://blog.csdn.net/u010780613/article/details/51491237 问题描述: 在使用Ubuntu系统的时候,遇到这样的一个问题 ...
- 土办法 填充NAS空间
最近需要把一个1.8TB的NAS 塞满,网上东拼西凑,找了个办法 写脚本,然后保存为tt40.sh, 并上传到NAS中. #!/bin/sh echo "space2->space11 ...
- 安装MySQL后经常弹出taskeng.exe~
taskeng.exe,是Microsoft任务计划程序引擎调用的安全进程.文件路径为C:\Windows\system32\taskeng.exe.大小165KB. 解决办法: 这个问题是Wind ...
- python之文件目录和路径
1.路径中不要出现中文,否则有极大可能报错 2.反斜杠问题 举例说明: 我们从Windows复制的文件路径是G:\beifen\Tea. 可以看到,路径用的是反斜杠:\. 由于反斜杠\在python里 ...
- PHPCMS V9 SQL查询篇
1.添加查询条件 {php $sql5 = " pay_type_int = 24"} {pc:content action="lists" catid=&qu ...
- Dubbo调用链(version:2.5.3)
Consumer 调用 Provider的过程: (CONSUMER)Dubbo服务调用处 --> 调用RPC代理 --> InvokerInvocationHandler#invoke( ...
- Ansible 使用 Playbook 管理 Nginx 配置文件
前面我们已经安装完 Nginx,但是在日常维护中经常需要修改配置文件,并重新加载配置文件,因此来写一个管理 Nginx 配置文件的 Playbook: [root@localhost ~]$ mkdi ...
- [Z]修炼成C++高手必看的C++书单
增添于网上的一些书单: C++/OPP/OOD系列: 层级一:语法/语意(C++) [Lippman2000] Essential C++ Essential C++,by Stanley B. Li ...