zoukankan      html  css  js  c++  java
  • unity3d基础02

    调试:

    在MonoDevelop里可以断点调试,注意绑定unity进程

    使用Debug.Log()打印信息

    创建游戏对象:

    GameObject test = GameObject.CreatePrimitive(PrimitiveType.Cube);

    GameObject t1 = instantiate(Resources.Load(“test”)) as GameObject;

    移动:

    test.transform.position = new Vector3(0,0,0);

    float translation = Time.deltaTime * 10; //使用这个移动的会慢一些

    transform.Translate(translation,0,0);  // 不指定的,移动的就是脚本绑定的游戏对象

    test = GameObject.Find ("Sphere");

    test.transform.Translate(translation,0,0); //移动的就是那个球了

    获取游戏对象:

    GameObject.Find(“testname”);

    获取一组:

    public GameObject[] test; //先声明,此处不能实例化

    test = GameObject.FindGameObjectsWithTag ("try"); //tag名可以自定义,在u3d里加好

    //此时获取的是一组,可以写在Start()里面

    test[1].transform.Translate(translation,0,0); //之后就可以使用了,如在update里

    获取一个:

    GameObject.FindGameObjectWithTag ("try");

    数组:(声明--数组实例化--数组元素实例化)
    声明: private Skill[] _skill;
    数组实例化:_skill=new Skill[Enum.GetValues(typeof(SkillName)).Length];
    元素实例化:for (int cnt = 0; cnt < _skill.Length; cnt++)
                   _skill[cnt] = new Skill();
    ①另外可以声明数组后,利用函数返回值进行数组实例化,而且此时
          GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy");
    ②使用方式可以如:
          foreach (GameObject enemy in go) {   }
    ③数组属于Array类,本身也有一些属性,如_skill.Length;

    ④函数传递数组时,形参用(Skill[] new_skill)即可(内部用new_skill.Length获取长度)。改变函数内形参的值,实参数组也会跟着改变。
     
    2.无论是数组还是容器亦或者其它变量,都可以在MonoBehaviour子类中以public权限声明后,不在脚本内实例化,而是在Unity3D软件的检视面板中赋值实现实例化。
      对于GameObject,Texture2D等类型的变量(或数组以及容器),一般都是在检视面板赋值。(但GO类型也可以用寻找GO等函数实例化,Texture2D类型则可以用C#硬盘读取图片的方式赋值)

    gameObject.GetComponent<组件名>(); //获取组件

    gameObject.AddComonpent("组件名");  //添加组件

    消息传递:

    //cube1是cube的子对象

    //cube的脚本里有void sayHi (string str) {Debug.Log(str + "@@@@");}

    //cube1的脚本里有void sayHello(string str) {Debug.Log(str + "!!!!");}

    ①向上发消息:

    cube1.SendMessageUpwards ("sayHi","hello"); //函数名+参数

    ②向自己的脚本里的函数发消息:

    cube1.SendMessage ("sayHello","Hello");

    ③向下发消息:

    temp.BroadcastMessage ("sayHello","Hello"); //temp是cube,这个写在cube脚本中

    //向GameObject发送一条消息,则该GameObject上挂载的所有脚本都会接收到该条消息

    预设prefab:

    是一种资源类型,可被重复使用的游戏对象。它可以被置入多个场景中,又或者能够在一个场景中被多次置入。当你在一个场景中增加一个Prefabs,你就实例化了一个Prefabs。所有Prefabs实例都是Prefab的克隆,只要Prefabs原型发生改变,所有的Prefabs实例都会产生变化。

    创建:

    将Hierarchy中的游戏对象拖到Asset下;在project点create,然后再拖对象过来。

    EG:

    //脚本绑定在cube上,为cube添加Box collider,Is trigger指接受碰撞,为小球Sphere增//加Rigidbody,使能够下落,然后增加Sphere Collider.如果此时将cube勾去Mesh Render,//即会变透明,下面的代码即可显示:小球下落,碰撞,重回原处,下落。

    //注意:碰撞双方不能都是Mesh Collider,会检测不到碰撞,如果一定要,勾选其中一个的Convex

    public GameObject prefab; 

    void OnTriggerEnter(Collider col) {

    //注意此处第一个小球的名字为Sphere,而后来克隆的小球名字都为Sphere(Clone)

    if (col.gameObject.name == "Sphere" || col.gameObject.name == "Sphere(Clone)"){

    Destroy(col.gameObject);//销毁小球

    }

    prefab = Instantiate (Resources.Load("Sphere")) as GameObject;

    }//实例化小球预设,我们从resources文件夹下载入预设

    Unity 内置GUI的特点:将控件显示,事件响应都放在OnGUI函数中

    实际,这种方式不够灵活且执行效率低,一般是采用第3方的NGUI插件来制作游戏界面

    GUI.Label://没有框的

    GUI.Label(new Rect(300,40,40,40),"你好");//X,Y,width,height,第2个参数显示文本内容

    GUI.Button: 

      if (GUI.Button(new Rect(300,40,40,40),"你好")){...}

    //通过在OnGUI里面判断GUI.Button是否返回true,显示是否按下

    GUI.TetxField:

      txt=GUI.TextField(new Rect(300,40,40,40),txt,10);

    //第2个参数表示输入框显示的内容,最后一个参数表示最大字符数

    控件:

    public float a,b,c,d;

    void OnGUI() {

    a = GUI.VerticalSlider (new Rect(0,50,200,200),a,0f,100f); //可以滑动的。a表示当前

    b = GUI.HorizontalSlider (new Rect(500,60,200,200),b,0f,100f);//最小和最大

    c = GUI.VerticalScrollbar (new Rect(0,100,200,200),c,100f,0f,100f);//第三个是size

    d = GUI.HorizontalScrollbar (new Rect(500,100,200,200),b,100f,0f,100f);//不能滑

    }

    //大部分GUI控件都可以通过GUILayout绘制,自动计算位置

    GUILayout.Button ("wooo");

    脚本控制对象的变换:

    ①obj.transfrom.position = new Vector3(x,x,x) //这个是移动到指定位置

    ② obj.transform.Rotate(new Vector3(x,x,x))

    ③obj.transform.Translate(new Vector3(x,x,x)) //这个是平移

    ④obj.transform.localScale = new Vector3(x,x,x) //改变大小

    注意:Vector3是指三维空间的向量,方向:

    Vector3.left,Vector3.right x轴方向Vector3.up,Vector3.down y轴方向

    Vector3.forward,Vector3.back z轴方向

    常用工具类:

    Time类:Time.time:  

    游戏开始到现在的游戏时间:Time.deltaTime:

    update方法中完成上一帧消耗的时间:

    Time.fixedTime: FixedUpdate方法中固定消耗时间的综合(可以通过Edit->project setting->Time去设置)

    Random.Range(min,max):

      返回最大和最小之间的一个数(包括最小值,不包括最大值)

    Mathf类:Mathf.abs,Mathf.Sin()....

  • 相关阅读:
    Problem : [NOIP2015普及组]扫雷游戏
    Problem : [NOIP2014普及组]珠心算测验
    Problem : [Noip2005]谁拿了最多奖学金
    Problem : [Noip2008]火柴棒等式
    Problem : [Noip2010普及组]导弹拦截
    Problem : [NOIP2013普及组]计数问题
    Problem : [Noip2003]麦森数
    Problem: [Noip2008] 笨小猴
    Problem : 暴力摩托
    Problem : [Usaco2017 Dec]Blocked Billboard
  • 原文地址:https://www.cnblogs.com/pxy7896/p/4671031.html
Copyright © 2011-2022 走看看