一、脚本编写

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. 本地文件到通过flume到hdfs

    配置文件 cd /usr/app/flume1.6/conf vi flume-dirTohdfs.properties #agent1 name agent1.sources=source1 age ...

  2. Unity3D学习笔记——Android远程真机调试(Unity Remote)

    前言:当使用Unity开发移动端的游戏,特别是使用到手机的传感器,如重力感应等,调试的时候,很麻烦, 因为每次都需要编译成APK后安装到手机中测试,而Unity Remote便能很好的解决这个问题,U ...

  3. android project 文件夹

    android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的 ...

  4. WebGL 绘制和变换

    1.使用缓冲区对象向顶点着色器传入多个顶点的数据,需要遵循以下五个步骤: 1.1 创建缓冲区对象(gl.createBuffer()). 1.2 绑定缓冲区对象(gl.bindBuffer()). 1 ...

  5. 视觉单词模型、词袋模型BoW

    多用于图像检索.分类 3.2.1.4 视觉单词模型 视觉词袋(BoVW,Bag of Visual Words)模型,是“词袋”(BoW,Bag of Words)模型从自然语言处理与分析领域向图像处 ...

  6. SpringBoot------新建一个项目

    1.新建一个Maven Project 2.选择项目路劲 3.选择Web App 4.添加项目名称 5.右击“Properties”->“Java Build Path”->“Source ...

  7. Java -- 异常的捕获及处理 -- Exception类与RuntimeException类

    7.3 Exception类与RuntimeException类 Exception类与RuntimeException类的联系与区别??? 例:字符串变为整型 Class : RuntimeExce ...

  8. samba 服务器

    1.apt-get install smaba 2.安装完成后apt-get install smbclient 然后就是配置那个.conf文件,这个到网上搜下ubuntu下配置smaba服务器就可以 ...

  9. 《C++ Primer Plus》16.1 string类 学习笔记

    16.1.1 构造字符串程序清单16.1使用了string的7个构造函数.程序清单16.1 str1.cpp---------------------------------------------- ...

  10. 如何将一个项目打成war包?

    如何将一个项目打成war包?进入该项目所在目录jar  -cvf  myProjec.war  myProject