Unity 进去区域时显示模型,离开区域时候隐藏模型

Posted DaLiangChen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 进去区域时显示模型,离开区域时候隐藏模型相关的知识,希望对你有一定的参考价值。

1. 在 “Main Camera” 下面创建一个 Cube ,调整大小, 并将其Tag 指定为“Player”(如下图所示)。

 

2.新建一个脚本,命名为 “Tourcamera” ,用来控制相机的移动(代码如下),并将其挂载在 “Main Camera” 对象上。

using UnityEngine;

/// <summary>导览相机</summary>
public class Tourcamera : MonoBehaviour

    private Transform tourCamera;

    public float moveSpeed = 1.0f;
    public float rotateSpeed = 90.0f;
    public float shiftRate = 2.0f;// 按住Shift加速

    private Vector3 direction = Vector3.zero;
    private Vector3 speedForward;
    private Vector3 speedBack;
    private Vector3 speedLeft;
    private Vector3 speedRight;
    private Vector3 speedUp;
    private Vector3 speedDown;


    private void Start()
    
        if (tourCamera == null) tourCamera = gameObject.transform;
    

    private void Update()
    
        if (Application.isEditor)
        
            getDirection();
            tourCamera.Translate(direction * moveSpeed * Time.deltaTime, Space.World);
        
    

    private void getDirection()
    
        if (Input.GetKeyDown(KeyCode.LeftShift)) moveSpeed *= shiftRate;
        if (Input.GetKeyUp(KeyCode.LeftShift)) moveSpeed /= shiftRate;

        speedForward = Vector3.zero;
        speedBack = Vector3.zero;
        speedLeft = Vector3.zero;
        speedRight = Vector3.zero;
        speedUp = Vector3.zero;
        speedDown = Vector3.zero;

        if (Input.GetKey(KeyCode.W)) speedForward = tourCamera.forward;
        if (Input.GetKey(KeyCode.S)) speedBack = -tourCamera.forward;
        if (Input.GetKey(KeyCode.A)) speedLeft = -tourCamera.right;
        if (Input.GetKey(KeyCode.D)) speedRight = tourCamera.right;
        if (Input.GetKey(KeyCode.E)) speedUp = Vector3.up;
        if (Input.GetKey(KeyCode.Q)) speedDown = Vector3.down;
        direction = speedForward + speedBack + speedLeft + speedRight + speedUp + speedDown;

        if (Input.GetMouseButton(0))
        
            tourCamera.RotateAround(tourCamera.position, Vector3.up, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime);
            tourCamera.RotateAround(tourCamera.position, tourCamera.right, -Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime);

            direction = v3RotateAround(direction, Vector3.up, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime);
            direction = v3RotateAround(direction, tourCamera.right, -Input.GetAxis("Mouse Y") * rotateSpeed * Time.deltaTime);
        
    

    private Vector3 v3RotateAround(Vector3 source, Vector3 axis, float angle)
    
        Quaternion q = Quaternion.AngleAxis(angle, axis);
        return q * source;
    

 3.新建一个脚本,命名为 “Tags”(代码如下),用来存放所有的标签名字。

public class Tags 

    /// <summary>玩家</summary>
    public const string PLAYER = "Player";

4.新建一个脚本,命名为 “PlayerTriggeShowAndHide”(代码如下),用来触发隐藏和显示对象。

using UnityEngine;

/// <summary>玩家触发显示和隐藏</summary>
public class PlayerTriggeShowAndHide : MonoBehaviour

    [Tooltip("触发作用对象集合")]
    public GameObject[] goArr;

    [Tooltip("是否触发默认事件")]
    public bool defaultEvent = true;
    [Tooltip("是否触发进入事件")]
    public bool enterEvent = true;
    [Tooltip("是否触发离开事件")]
    public bool exitEvent = true;

    [Tooltip("是否触发事件相反执行")]
    public bool contrary = false;


    private void Awake()
    
       if(defaultEvent) showAndHide(contrary);
    

    /// <summary>进入区域</summary>
    public void OnTriggerEnter(Collider other)
    
        if (other.transform.tag.Equals(Tags.PLAYER) && enterEvent)
        
            showAndHide(!contrary);
        
    

    /// <summary>离开区域</summary>
    public void OnTriggerExit(Collider other)
    
        if (other.transform.tag.Equals(Tags.PLAYER) && exitEvent)
        
            showAndHide(contrary);
        
    

    /// <summary>显示或隐藏对象</summary>
    private void showAndHide(bool show)
    
        if (goArr != null && goArr.Length != 0)
        
            for (int i = 0; i < goArr.Length; i++)
            
                GameObject go = goArr[i];
                if (go != null) go.SetActive(show);
            
        
    

5.创建一个“Cube”,勾选 “Is Trigger”,用来制作触发区域。并挂载 “PlayerTriggeShowAndHide” 脚本。

 6. 新建一个 “Sphere”,作为触发显示对象,并赋予到“Cube/PlayerTriggeShowAndHide/goArr” 属性上(如下图所示)。

 7.大功告成!运行并测试。

以上是关于Unity 进去区域时显示模型,离开区域时候隐藏模型的主要内容,如果未能解决你的问题,请参考以下文章

HP1018 打印机安装驱动时显示安装错误,传递给系统调用的数据区域太小,这怎么处理?

单击 understrap 主题上的内容区域时显示不必要的边框

Swing:鼠标悬停时显示/隐藏按钮

EventListener 在悬停时显示隐藏

怎么在debug时显示全部的变量值

Unity判断鼠标是否在ui的Recttransform内的源码