Unity 3D 基于 C#脚本的交互设计

  • 实验环境

Unity Hub,编辑版本:2023.2.17f1c1

  • 实验内容

    1. 运行上述“键盘交互”、“鼠标交互”、“GUI 按钮交互”示例代码(需自行

    补充声明变量等语句),描述代码运行后的效果有哪些。

    键盘交互:

    using UnityEngine;

    public class VR_8_3 : MonoBehaviour

    {

        // Start is called before the first frame update

        void Start()

        {

            

        }

        // Update is called once per frame

        void Update()

        {

            // 键盘的上下左右方向键可以翻看模型的各个面(模型旋转)

            if (Input.GetKey(KeyCode.UpArrow))

            {

                transform.Rotate(Vector3.right * Time.deltaTime * 10);

            }

            if (Input.GetKey(KeyCode.DownArrow))

            {

                transform.Rotate(Vector3.left * Time.deltaTime * 10);

            }

            if (Input.GetKey(KeyCode.LeftArrow))

            {

                transform.Rotate(Vector3.up * Time.deltaTime * 10);

            }

            if (Input.GetKey(KeyCode.RightArrow))

            {

                transform.Rotate(Vector3.down * Time.deltaTime * 10);

            }

        }

    }

    实验结果截图:

    实验分析:

    Start()函数是脚本对象的初始化方法,它只在 VR 开始的第一帧被执行一次。Update()函数是在 VR 的每一帧都执行一次(1 秒默认为 30 帧),且是在 Start()函数后执行。

    Time.deltaTime*10表示:以每秒 10°旋转(用于 Rotate 函数时)

    鼠标交互:

    using UnityEngine;

    public class VR_8_3 : MonoBehaviour

    {

        // Start is called before the first frame update

        void Start()

        {

            

        }

        // Update is called once per frame

        void Update()

        {

            // 鼠标左键按下时翻转模型

            if (Input.GetMouseButtonDown(0))

            {

                transform.Rotate(Vector3.right * Time.deltaTime * 10);

            }

            // 鼠标左键按住时翻转模型

            if (Input.GetMouseButton(0))

            {

                transform.Rotate(Vector3.left * Time.deltaTime * 10);

            }

            // 鼠标左键抬起时翻转模型

            if (Input.GetMouseButtonUp(0))

            {

                transform.Rotate(Vector3.up * Time.deltaTime * 10);

            }

        }

    }

    实验结果截图:

    实验分析:

    使用了Input.GetMouseButtonDown(0)、Input.GetMouseButton(0)和Input.GetMouseButtonUp(0)来检测鼠标左键的状态。

    Input.GetMouseButtonDown(0)用于检测鼠标左键是否按下。

    Input.GetMouseButton(0)用于检测鼠标左键是否按住。

    Input.GetMouseButtonUp(0)用于检测鼠标左键是否抬起。

    GUI按钮交互:

    using UnityEngine;

    public class GUI : MonoBehaviour

    {

        public GameObject Cube; // 声明一个 GameObject 类型的变量,用于引用需要操作的 Cube

        public GameObject Sphere; // 声明一个 GameObject 类型的变量,用于引用需要操作的 Sphere

        // Start 方法在第一帧更新之前调用

        void Start()

        {

            // 在 Start 方法中初始化 Cube 和 Sphere 变量

            Cube = GameObject.Find("Cube");

            Sphere = GameObject.Find("Sphere");

        }

        // Update 方法每帧都会调用一次

       

        void OnGUI()

        {

            // 通过 GUILayout.Button 创建按钮,并在按钮点击时执行相应的操作

            if (GUILayout.Button("向左移动物体"))

            {

                // 向左移动 Cube

                Cube.transform.position = Cube.transform.position + new Vector3(-0.5f, 0, 0);

            }

            if (GUILayout.Button("向右移动物体"))

            {

                // 向右移动 Cube

                Cube.transform.Translate(new Vector3(0.5f, 0, 0));

            }

            if (GUILayout.Button("放大物体"))

            {

                // 放大 Sphere

                Sphere.transform.localScale *= 1.5f;

            }

            if (GUILayout.Button("缩小物体"))

            {

                // 缩小 Sphere

                Sphere.transform.localScale *= 0.5f;

            }

            if (GUILayout.Button("物体自转"))

            {

                // 物体自转

                Cube.transform.Rotate(new Vector3(0, 10, 0));

            }

            if (GUILayout.Button("Cube围绕Sphere进行旋转"))

            {

                // Cube 围绕 Sphere 进行旋转,第一个参数是旋转轴,第二个参数是旋转角度

                Cube.transform.RotateAround(Sphere.transform.position, Vector3.up, 10f);

            }

        }

    实验结果截图:

    放大按钮:

    实验分析:

    1)GUILayout.Button("向左移动物体")

    在 VR 场景中创建 GUI 按钮“向左移动物体”,并检测该按钮是否有被鼠标选中并按下。

    2)transform.position

    Transform 类的一个成员变量,表示物体的位置坐标(x,y,z)。对应于物体Transform 组件的 Position 参数,如下图。所以,在代码中访问物体某个组件的某个参数的写法是:组件名.参数名(组件名和参数名的首字母都要小写)。

    2. 编程实现以下场景(交互方式可自行选择是用键盘或鼠标按钮,还是 GUI

    按钮。下面以 GUI 按钮为例):

    在 Hierarchy 窗口创建一个胶囊体(Capsule)和平面(Plane);

    为创建的平面添加一个 Script 组件,即 C#代码文件,实现以下功能:

    通过代码创建一个球体(Sphere)、立方体(Cube),用 transform.position = new

    Vector3(x,y,z)分别给它们定义两个不同的三维空间位置(x,y,z);

    在代码中通过 GameObject.Find()方法获取之前在 Hierarchy 窗口所创建的胶囊体;

    在代码中令胶囊体一直自转;

    设置“胶囊体变色”GUI 按钮,点击后可令其颜色变为绿色;

    设置“球体变色”和“立方体变色”GUI 按钮,点击后可令球体和立方体分别变为蓝色和红色;

    设置“立方体自转变大”按钮,点击后可令立方体自转的同时变大(自转速度自定);

    设置“立方体自转变小”按钮,点击后可令立方体自转的同时变小(自转速度自定);

    设置“立方体平移”按钮,点击后可令立方体在自转的同时对准球体的方向平移(平移速度自定,以世界坐标系作为平移的参考坐标系);

    设置“胶囊体公转”按钮,点击后可令胶囊体绕着立方体公转(公转速度自定)

    实验代码:

    using UnityEngine;

    public class ColorChange : MonoBehaviour

    {

        public GameObject sphere;

        public GameObject cube;

        public float rotationSpeed = 1f;

        public float scaleSpeed = 0.1f;

        public float translationSpeed = 1f;

        public float revolutionSpeed = 1f;

        private bool capsuleRotating = false;

        private bool sphereColorChanged = false;

        private bool cubeColorChanged = false;

        private bool cubeScalingUp = false;

        private bool cubeScalingDown = false;

        private bool cubeTranslating = false;

        private bool capsuleRevolving = false;

        void Start()

        {

            sphere.transform.position = new Vector3(1, 1, 1);

            cube.transform.position = new Vector3(-1, -1, -1);

        }

        void Update()

        {

            if (capsuleRotating)

            {

                transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime);

            }

            if (cubeScalingUp)

            {

                cube.transform.localScale += new Vector3(scaleSpeed, scaleSpeed, scaleSpeed) * Time.deltaTime;

            }

            if (cubeScalingDown)

            {

                cube.transform.localScale -= new Vector3(scaleSpeed, scaleSpeed, scaleSpeed) * Time.deltaTime;

            }

            if (cubeTranslating)

            {

                Vector3 direction = (sphere.transform.position - cube.transform.position).normalized;

                cube.transform.Translate(direction * translationSpeed * Time.deltaTime, Space.World);

            }

            if (capsuleRevolving)

            {

                transform.RotateAround(cube.transform.position, Vector3.up, revolutionSpeed * Time.deltaTime);

            }

        }

        void OnGUI()

        {

            if (GUI.Button(new Rect(10, 10, 150, 50), "Capsule Rotate"))

            {

                capsuleRotating = true;

            }

            if (GUI.Button(new Rect(10, 70, 150, 50), "Sphere Change Color"))

            {

                sphere.GetComponent<Renderer>().material.color = Color.blue;

                sphereColorChanged = true;

            }

            if (GUI.Button(new Rect(10, 130, 150, 50), "Cube Change Color"))

            {

                cube.GetComponent<Renderer>().material.color = Color.red;

                cubeColorChanged = true;

            }

            if (GUI.Button(new Rect(10, 190, 150, 50), "Cube Scale Up"))

            {

                cubeScalingUp = true;

            }

            if (GUI.Button(new Rect(10, 250, 150, 50), "Cube Scale Down"))

            {

                cubeScalingDown = true;

            }

            if (GUI.Button(new Rect(10, 310, 150, 50), "Cube Translate"))

            {

                cubeTranslating = true;

            }

            if (GUI.Button(new Rect(10, 370, 150, 50), "Capsule Revolve"))

            {

                capsuleRevolving = true;

            }

        }

    }

    实验结果截图:

    实验分析:

    首先,我们引入了UnityEngine命名空间。

    然后,定义了一些公共变量:

    sphere和cube分别是用来引用场景中的球体和立方体游戏对象的公共变量。

    rotationSpeed是用于控制旋转速度的公共浮点数变量。

    scaleSpeed是用于控制缩放速度的公共浮点数变量。

    translationSpeed是用于控制平移速度的公共浮点数变量。

    revolutionSpeed是用于控制绕某个游戏对象旋转的速度的公共浮点数变量。

    接下来,定义了一些私有变量来追踪各种操作的状态:

    capsuleRotating用于追踪是否正在进行胶囊体的旋转操作。

    sphereColorChanged和cubeColorChanged分别用于追踪球体和立方体是否已经改变了颜色。

    cubeScalingUp和cubeScalingDown分别用于追踪立方体是否正在进行缩放操作。

    cubeTranslating用于追踪立方体是否正在进行平移操作。

    capsuleRevolving用于追踪是否正在进行胶囊体的绕某个游戏对象旋转的操作。

    在OnGUI()方法中,创建了一些按钮来触发不同的操作:

    "Capsule Rotate"按钮用于启动胶囊体的旋转操作。

    "Sphere Change Color"按钮用于将球体的颜色更改为蓝色。

    "Cube Change Color"按钮用于将立方体的颜色更改为红色。

    "Cube Scale Up"按钮用于启动立方体的缩放增加操作。

    "Cube Scale Down"按钮用于启动立方体的缩放减小操作。

    "Cube Translate"按钮用于启动立方体的平移操作。

    "Capsule Revolve"按钮用于启动胶囊体的绕立方体旋转操作。

  • 实验心得总结
  • 通过编写脚本,我们可以控制游戏对象的运动、旋转、缩放等行为。这为我们创造有趣的游戏机制提供了非常大的灵活性。通过捕捉用户的输入,比如键盘按键、鼠标点击等,我们可以实现玩家与游戏世界的交互。例如,通过鼠标点击来选择角色或者点击按钮来执行特定操作。借助C#脚本,我们可以创建UI元素,比如按钮、滑块、输入框等,让玩家可以与游戏进行更直接的交互。编写脚本的过程中,遇到错误是不可避免的,但通过调试和错误处理,我们可以逐步完善代码,使其更加健壮和可靠。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值