- 实验环境
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元素,比如按钮、滑块、输入框等,让玩家可以与游戏进行更直接的交互。编写脚本的过程中,遇到错误是不可避免的,但通过调试和错误处理,我们可以逐步完善代码,使其更加健壮和可靠。