当前位置: 首页 > news >正文

URP-UGUI交互功能实现

一、非代码层面实现交互(SetActive)

Button :在OnClick()中添加SetActive方法(但是此时只首次有效)

Toggle :在OnClick()中添加动态的SetActive方法

(给开关Toggle添加对目标对象的SetActive方法,此时有动态和静态两种选项。选择动态时,对象的显示与隐藏跟随开关的状态而改变)

二、代码层面交互(滑动条控制旋转速度、按钮改变颜色)

1. 利用Slider滑动条改变物体的旋转速度(实则改变旋转角度)

补充旋转代码知识:

  

(1)首先创建一个Rotate脚本,拖动到用于旋转的对象上,在Rotate脚本中的Upadate方法中添             加this.transform.Rotate(Vector3.up,Angle*Time.deltaTime,Space.Self);用于控制对象的旋             转。其中声明Angle属性的代码为:public float Angle;

(2)然后创建一个脚本,拖动到Canvas上,用于控制UGUI中的滑动条和按钮的行为

(3)在脚本中创建public GameObject obj;   public Slider slider;   public Button Button;

         Obj中用于存放用于旋转的对象,slider中存放滑动条

(4)在Start方法中添加对应的监听功能 : slider.onValueChanged.AddListener(Onslider);

         然后在Onslider方法中将滑动条中的Value值赋予给Rotate脚本中的Angle属性

         public void OnSlider(float value)
         {
              obj.GetComponent<RotatePractice>().speed = slider.value;
          }

    

(5)或者可以直接在Update()方法中添加 obj.GetComponent<RotatePractice>().speed = slider.value; 这样就可以不需要使用监听功能

其中可以使用枚举来选择物体对象的旋转轴

//定义旋转轴

private Vector3 direct;


public enum RotateDirect
{
    X轴正方向,
    X轴负方向,
    Y轴正方向,
    Y轴负方向,
    Z轴正方向,
    Z轴负方向
}

//声明枚举变量
public RotateDirect dir;

void Update()
{
    switch(dir)
    {
        case RotateDirect.X轴正方向:
            direct = Vector3.right; break;
        case RotateDirect.X轴负方向:
            direct = Vector3.left; break;
        case RotateDirect.Y轴正方向:
            direct = Vector3.up; break;
        case RotateDirect.Y轴负方向:
            direct = Vector3.down; break;
        case RotateDirect.Z轴正方向:
            direct= Vector3.forward; break;
        case RotateDirect.Z轴负方向:
            direct = Vector3.back; break;
    }

 //利用滑动条控制速度
 this.transform.Rotate(direct, Angle * Time.deltaTime, Space.Self);

}


2. 利用按钮改变物体对象的颜色(使其生成随机颜色)

在控制UGUI的脚本中添加  public Button button;

在Start方法中添加监听功能 : button.onClick.AddListener(OnButton)

void OnButton()
{Debug.Log("111");Ghost.GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial.SetColor("_Color",new Color(Random.value,Random.value,Random.value,1));
}

代码:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;
using UnityEngine.UI;public class Rotate : MonoBehaviour
{//旋转的速度//public float speed;//利用滑动条控制速度public float Angle;private Vector3 direct;public enum RotateDirect{X轴正方向,X轴负方向,Y轴正方向,Y轴负方向,Z轴正方向,Z轴负方向}// Start is called before the first frame update//声明枚举变量public RotateDirect dir;void Start(){}// Update is called once per framevoid Update(){switch(dir){case RotateDirect.X轴正方向:direct = Vector3.right; break;case RotateDirect.X轴负方向:direct = Vector3.left; break;case RotateDirect.Y轴正方向:direct = Vector3.up; break;case RotateDirect.Y轴负方向:direct = Vector3.down; break;case RotateDirect.Z轴正方向:direct= Vector3.forward; break;case RotateDirect.Z轴负方向:direct = Vector3.back; break;}//自旋转  right代表X轴,up代表Y轴,forward代表Z轴//参数分别为旋转轴,旋转的角度,坐标系的选择//this.transform.Rotate(Vector3.up,Angle*10*Time.deltaTime,Space.Self);//利用滑动条控制速度this.transform.Rotate(direct, Angle * Time.deltaTime, Space.Self);//第二种,需要四个参数分别是X轴上旋转的角度、Y轴上旋转的角度、Z轴上旋转的角度,模型围绕旋转的坐标系//this.transform.Rotate(0, 30 * Time.deltaTime, 0, Space.Self);}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;public class UIInteractive : MonoBehaviour
{public GameObject Ghost;public Button button;public Toggle toggle;public Slider slider;  //滑动条void Start(){//当点击按钮时,触发按钮中onClick方法的监听功能button.onClick.AddListener(OnButton);toggle.onValueChanged.AddListener(OnToggle);slider.onValueChanged.AddListener(Onslider);}//按钮void OnButton(){Debug.Log("111");Ghost.GetComponentInChildren<SkinnedMeshRenderer>().sharedMaterial.SetColor("_Color",new Color(Random.value,Random.value,Random.value,1));}//开关,利用开关设置对象的显示和隐藏; 其中Toggle函数中需要添加一个布尔值的参数void OnToggle(bool ison){Ghost.SetActive(ison);}void Onslider(float value){//获取怪物身上的脚本组件中的Speed参数Ghost.GetComponent<Rotate>().Angle=slider.value;}
}

效果展示: 

【太妃糖耶】Up主探索中,欢迎收看求三连!_哔哩哔哩_bilibili

http://www.xdnf.cn/news/94357.html

相关文章:

  • NLP高频面试题(五十三)——LLM中激活函数详解
  • 【无人机】无人机光流模块Optical Flow设置(三),光流测距一体传感器的配置。凌启科技的光流测距一体模块的测试。
  • 珈和科技助力“农险提效200%”!“遥感+”技术创新融合省级示范项目荣登《湖北卫视》!
  • Javashop新零售电商系统:构建智能零售生态的终极解决方案
  • 【android bluetooth 框架分析 03】【Bta 层详解 1】【Bluetooth Application Laye 介绍】
  • 5.4.云原生与服务网格
  • 数据为基:机器学习中数值与分类数据的处理艺术及泛化实践
  • C++ 容器查找效率
  • Java基础:认识注解,模拟junit框架
  • 如何提升个人解决问题的能力?
  • Ethan独立开发产品日报 | 2025-04-22
  • CS 系列 USB3.0 工业面阵相机不同快门类型的作用及其区别
  • 从边缘到云端,如何通过时序数据库 TDengine 实现数据的全局洞
  • 神经网络相关内容
  • JavaScript 渲染内容爬取:Puppeteer 高级技巧与实践
  • AI与Web3.0:技术融合
  • python动态注册执行action
  • QT 打包安装程序【windeployqt.exe】报错c000007d原因:Conda巨坑
  • 单片机外设模块汇总与介绍
  • 动态规划(一)【背包】
  • cf | Binary Typewriter
  • Hive 多表查询案例
  • poi生成横向文档以及复杂表头
  • 【Hive入门】Hive数据模型与存储格式深度解析:从理论到实践的最佳选择
  • 【新能源科学与技术】MATALB/Simulink小白教程(一)实验文档【新能源电力转换与控制仿真】
  • 敏捷开发中的AI测试:未来的趋势与挑战
  • ubantu18.04(Hadoop3.1.3)Hive3.1.2安装指南
  • 静态存储区(Static Storage Area)的总结
  • 深入解析:C 语言实现快速傅里叶变换(FFT)算法
  • HTML与Web 性能优化:构建高速响应的现代网站