• Unity之C#脚本学习笔记


    参考书籍:《Unity 2017 从入门到精通》

    C#脚本编写Tips

    • 所有添加到游戏对象的C#脚本类都必须直接或间接从MonoBehaviour类中继承。

    • 使用Start或者Awake函数来初始化类,避免使用构造函数。

      Start和Awake函数在一定条件下会被自动调用,称为必然事件。常见的必然事件还有Update、FixedUpdate和LateUpdate。

    • 类名(特指从MonoBehaviour类中继承的行为类)要与脚本文件名相同,否则在添加脚本到游戏对象时会提示错误。

    • 协同函数(Coroutines)返回类型必须是IEnumerator,并且用yield return代替yield。

      这一条还不是很明白。

    访问游戏对象和组件

    访问游戏对象(GameObject)

    • GameObject.Find():寻找指定名称或路径的游戏对象。

      无法查找隐藏对象,使用方便但效率低下。

    • GameObject.FindWithTag():寻找指定标签的游戏对象。

    • Transform.Find():通过名字或路径查找子对象。

      可以查找隐藏对象,前提是transform所在根节点可见(active=true)。查找对象必须是transform节点下的子对象。

    访问组件(Component)

    一个游戏对象可以包含多个组件,且脚本也属于组件的一种。

    • GetComponent/GetComponents<组件(类型)名称>():得到组件/组件列表。
    • GetComponentInChildren/GetComponentsInChildren:得到得到对象或对象子物体上的组件/组件列表。

    示例

    1. 新建命名为Player的空游戏对象,挂载Player.cs脚本。

    2. 脚本中在Player类中把要访问的游戏对象和组件声明为成员变量。

      //声明GameObject成员变量
      public GameObject cube;
      //声明Transform成员变量
      public Transform sphereTransform;
      
      • 1
      • 2
      • 3
      • 4
    3. 返回Unity,此时打开Player的检视视图,发现多了两个值为None的变量Cube和Sphere Transform。

    4. 将层级视图中的Cube和Sphere拖到Player脚本的对应变量中进行赋值(将对象和组件的引用保存到成员变量中)。实现了在脚本中访问这两个成员变量。

    image-20221114091516041

    协同程序

    Coroutine称为协同程序,可以和主程序并行运行,和多线程类似。

    鼠标输入

    鼠标输入的相关事件包括鼠标移动、按键的点击等。Input类中和鼠标有关的方法和变量如下:

    名称作用
    mousePosition获取当前鼠标指针位置的像素坐标(只读)
    GetMouseButtonDown鼠标按键按下的第一帧返回true
    GetMouseButton鼠标按键按住期间一直返回true
    GetMouseButtonUp鼠标按键松开的第一帧返回true
    GetAxis(“Mouse X”)得到一帧内鼠标在水平方向的移动距离
    GetAxis(“Mouse Y”)得到一帧内鼠标在垂直方向的移动距离

    鼠标指针位置通过屏幕的像素坐标来表示。屏幕左下角为原点(0,0),右上角为(Screen.width,Screen.height)。mousePosition变量类型为Vector3,x分量对应水平坐标,y分量对应垂直坐标,z分量始终为0。

    示例

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RotateObjControl : MonoBehaviour
    {
        float horizontalSpeed = 2.0f;
        float verticalSpeed = 2.0f;
    
        // Update is called once per frame
        void Update()
        {
            // 鼠标左键按住,0左键,1右键,2中键
            if (Input.GetMouseButton(0))
            {
                float h = horizontalSpeed * Input.GetAxis("Mouse X");
                float v = verticalSpeed * Input.GetAxis("Mouse Y");
                transform.Rotate(v, h, 0);  // 此处的transform是当前脚本挂载对象的组件
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    该示例中,脚本通过读取鼠标左键输入控制挂载对象旋转。

    Socket通信

    示例:创建简单的TCP客户端

    创建流程:

    1. 创建Socket对象。
    2. 将新建的Socket对象连接指定的服务器IP和端口号。
    3. 发送数据到服务器和从服务器接收数据。

    首先,初始化客户端,与服务器建立连接。

    String address = "127.0.0.1";
    int port = 8000;
    
    IPAddress ip = IPAddress.Parse(address);  //将address地址字符串转换成IPAddress实例
    ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//使用指定的地址簇协议、套接字类型和通信协议
    IPEndPoint endPoint = new IPEndPoint(ip, port); // 用指定的ip和端口号初始化IPEndPoint实例
    ClientSocket.Connect(endPoint);  //与远程主机建立连接
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这里的address可以是局域网或者互联网的IP地址,也可以是本机的IP地址(相当于本机既做服务器又做客户端,主要用于开发测试方便)。

    客户端向服务器发送数据。

    string data = "hello mstifiy!";
    byte[] message = Encoding.UTF8.GetBytes(data);
    ClientSocket.Send(message);
    //ByteBuffer buffer = new ByteBuffer();
    //buffer.WriteString(data);
    //ClientSocket.Send(WriteMessage(buffer.ToBytes()));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    客户端从服务器接收数据。

    byte[] receive = new byte[150000];
    ClientSocket.Receive(receive);
    string data = Encoding.UTF8.GetString(receive);
    //ClientSocket.Receive(receive);
    //ByteBuffer buffer = new ByteBuffer(receive);
    //string data = buffer.ReadString();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    UGUI

    Canvas

    Canvas(画布)是存放所以UI的容器,所有的UI都必须放到画布的子节点下。

    Inspector(检视视图)相关设置:

    Render Mode渲染模式
    Screen Space-Overlay画布拉伸以适应全屏大小,使控件渲染与其他物体前方。
    Screen Space-Camera画布以特定的距离放置在指定的相机前,UI被指定相机渲染。
    World Space画布和其他游戏对象一样渲染于世界空间,此时可以调整Rect Transform来改变画布大小。
    UI Scale ModeUI的缩放模式
    Constant Pixel Size固定的像素大小
    Scale With Screen Size根据屏幕大小进行缩放
    Constant Physical Size固定的物理大小(cm、mm等)

    Slider滑动条示例

    • 在Scene中创建一个Slider对象,缩放到合适比例。

    image-20221114203046046

    控件的相关参数和事件说明如下:

    • 事件绑定

      • 可视化创建及事件绑定。

        新建脚本TestSlider.cs,代码如下:

        using System.Collections;
        using System.Collections.Generic;
        using UnityEngine;
        
        public class TestSlider : MonoBehaviour
        {
            public void SliderOnValueChanged(float value)
            {
                Debug.Log("滑动条值变化:" + value);
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11

        将该脚本添加到Slider上,然后将层级视图中的Slider(也就是脚本挂载的对象)拖到On Value Changed事件中,然后选择对应的SliderOnValueChanged函数,即可完成事件绑定。

        image-20221114212008422

        image-20221114212110752

        绑定成功后运行Unity,可以看到随着滑动条的拖动,控制台输出对应的值。

        image-20221114212325727

      • 直接通过脚本监听事件。

        新建脚本TestSlider.cs,代码如下:

        using UnityEngine;
        using UnityEngine.UI;
        
        public class TestSlider : MonoBehaviour
        {
            public Slider m_Slider;
            private void Start()
            {
                //监听滑动条变化事件
                m_Slider.onValueChanged.AddListener(SliderOnValueChanged);
            }
            void SliderOnValueChanged(float value)
            {
                Debug.Log("滑动条值变化:" + value);
            }
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        • 12
        • 13
        • 14
        • 15
        • 16

        将该脚本添加到Slider对象上,并将其面板中的Slider变量设置为Slider对象。完成事件绑定。

        image-20221114213137816

        运行效果和上一种方法相同。

    总结示例

    通过滑动条实现对bunny兔子网格渲染颜色的改变,简称“变色兔”。

    首先,把bunny.obj文件拖到Assets文件夹,并进行一些调整配置。

    image-20221114220943401

    新建ColorChange.cs脚本,其代码如下:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class ColorChange : MonoBehaviour
    {
        public Slider m_Slider;
        public GameObject bunny;
    
        public void bunny_color_change(float value)
        {
            bunny.GetComponent().material.color = new Vector4(value, value, value, 1);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    绑定事件,运行。

    image-20221114225136096

    效果如下:

    GIF 2022-11-14 23-04-35

  • 相关阅读:
    Qt通过正则表达式筛选出字符串中的手机号
    c++异常详解
    国内周边游小程序源码
    java项目_第164期ssm定西扶贫惠农推介系统-_java毕业设计_计算机毕业设计
    关于Android线程和线程池的那些事
    极智开发 | 阿里云ECS本地开发环境搭建
    Java 项目-基于 SpringBoot+Vue的疫情网课管理系统
    如何开发物联网 APP?
    【教3妹学算法-每日3题(1)】最大重复子字符串
    chinese_llama_aplaca训练和代码分析
  • 原文地址:https://blog.csdn.net/qq_39784672/article/details/127857798