一、脚本编写

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笔记 英保通三 脚本编写 、物体间通信的更多相关文章

  1. Unity3D笔记 英保通八 关节、 布料、粒子系统

    一.关节1.1..链条关节 Hinge joint :他可以模拟两个物体间用一根链条连接在一起的情况,能保持两个物体在一个固定距离内部相互移动而不产生作用力,但是达到固定距离后就会产生拉力 1.2.. ...

  2. Unity3D笔记 英保通四 虚拟轴应用及键盘事件

    Input: 1.使用这个类能够读取输入管理器设置的按键,以及访问移动设备的多点触控或加速感应数据.想要读取轴向使用Input.GetAxis方法获取下列默认轴: "Horizontal&q ...

  3. Unity3D笔记 英保通一

    一.材质和着色器 1.材质和着色器紧密的联系,其中材质相当于是一个框架,而着色器就是框架中中的内容.在材质框架中可以选择不同的Shader并调节不同的 属性 Material和Physic Mater ...

  4. Unity3D笔记 英保通二

    一.访问另一个物体 1.代码中定义一个public的物体 例如:var target:Transform; 在面板上直接拖拽一个物体赋值给target 2.通过GameObject.Find(&quo ...

  5. Unity3D笔记 英保通十 射线碰撞器检测

    射线碰撞检测可以用来检测方向和距离: 通过Physics.RayCast光线投射来实现:常用于射击利用发射的射线来判断.还有对战中刀剑交战中.. 一.要涉及到RayCast和RayCastHit 1. ...

  6. Unity3D笔记 英保通九 创建数

    Unity中创建树:可以直接通过程序自动来创建树木还可以手动创建树木(本质上在我看来就是给程序自动创建的树动动”小手术“) 一.程序自动创建树木 3.1.层次视图中创建:一个平行光.摄像机.地.数并且 ...

  7. Unity3D笔记 英保通七 物理引擎

    给球体添加刚体RigidBody和球体碰撞器Sphere Collider 效果: OnTriggerEnter() 代码 using UnityEngine; using System.Collec ...

  8. Unity3D笔记 英保通六 角色控制器

    一.角色控制器 U3D有两种角色控制方式:Rigidbody刚体.角色控制器组件(胶囊体组件) 面试的题目中经常会遇到这个问题: CharacterController和Rigidbody的区别? 这 ...

  9. Unity3D笔记 英保通五 鼠标事件与GUI系统双击检测

    一.如何使用GUI事件来检测鼠标是否按下的事件: 获取当前事件:var e:Event=Event.current: using UnityEngine; using System.Collectio ...

随机推荐

  1. IBM Personal Communications 软件:精简绿色版TN3270终端模拟器:经测试可以在 (winxp、win2003、win764)上运行

    全系列版本啊!耗费了我大量的时间和精力,深夜熬到3点! 注意:如何使用?解压后,里面有个reg注册表文件,以管理员权限用户双击加载即可. http://files.cnblogs.com/files/ ...

  2. 如果你的eclipse在每次run或debug时都莫名其妙的做一件事

    新项目,使用Ant打war包.结果写完了Ant以后,包是打好了,却使eclipse以后每次run或debug时都莫名其妙地自动先执行这个Ant, 让人十分苦恼. 其实,是你的eclipse设置出了问题 ...

  3. windows2008 使用nginx 反向代理实现负载均衡解决HTTPS 证书问题

    由于项目需要 负载均衡由NBL 转成nginx 反向代理.考虑都是https模块,所以证书成了个难题. 解决方案: 1.下载openssl(windows 安装包) 2.打开bin/下面的openss ...

  4. 关于移位运算符>>和<<

    首先,移位运算符有三种,其操作类型只支持:byte / short / char / int和long五种. << 左移运算符,表示将左边的操作数的二进制数据向左移动*位,移动后空缺位以0 ...

  5. symfony获取POST数据

    $request = $this->getRequest(); $messageid = $this->strip_tags($request->get('messageid')); ...

  6. 8 -- 深入使用Spring -- 4...3 AOP的基本概念

    8.4.3 AOP的基本概念 AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面.AOP面向的是程序运行中各个步骤,希望以更更好的方式来组合业务处理的各个步骤. AOP框架并不与特定的代码耦合 ...

  7. 8 -- 深入使用Spring -- 3...1 Resource实现类ServletContextResource

    8.3.1 Resource实现类------ServletContextResource:访问相对于ServletContext路径下的资源的实现类. 4.访问应用相关资源 Spring提供了Ser ...

  8. 8 -- 深入使用Spring -- 2...5 Spring 3.0 新增的注解

    8.2.5 Spring 3.0 新增的注解 @DependsOn @Lazy @DependsOn :用于强制初始化其他Bean.修饰Bean类或方法,可以指定一个字符串数组作为参数,每个数组元素对 ...

  9. ios开发之--所有设备的屏幕尺寸

    所有设备型号官网地址:https://www.theiphonewiki.com/wiki/Models iPhone: 机型 像素 比例 像素密度 屏幕尺寸 机型代码 发布日期 iPhone 2g ...

  10. Ansible 实战:一键安装 LNMP

    Ansible 配置文件 : [root@center /data/ansiblework]# cat ansible.cfg [defaults] remote_user = root remote ...