二,碰撞检测方法
此demo制作是将相机充当玩家,一个大的透明立方体下包含多个模型,当相机与透明立方体发生碰撞的时候,透明立方体下的模型都改变透明度(模型的材质需要设置为可改变透明度,也就是将其设置为Transparent)。
1,新建立方体。如图,大的立方体里面放置两个立方体,三个立方体的材质的渲染模式都改变为Transparent的,上篇有教程,这里不再赘述。
2.透明立方体添加碰撞盒和刚体以及BoxFader.cs脚本,勾选设置如下
3.BoxFader.cs脚本内容如下,这里的foreach循环保证:如果你换成多个模型,每个模型包含多个材质也能保证所有遍历所有材质并且改变其透明度
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BoxFader : MonoBehaviour
{
public float fadeSpeed, fadeAmount;//分别是透明速度和透明度
public bool DoFade;
public GameObject[] cubes;
float originalOpacity;
Material[] mats;
Material[] mats2;
// Start is called before the first frame update
void Start()
{
mats = cubes[0].GetComponent<Renderer>().materials;
mats2 = cubes[1].GetComponent<Renderer>().materials;
// Debug.Log("材料有几种以及数量" + mats.Length);
foreach (Material mat in mats)
{
originalOpacity = mat.color.a;
}
foreach (Material mat in mats2)
{
originalOpacity = mat.color.a;
}
// FadeNow();
}
// Update is called once per frame
void Update()
{
if (DoFade)
{
FadeNow();
}
else
{
RestFade();
}
}
void FadeNow()
{
foreach (Material mat in mats)
{
Color currentColor = mat.color;
Color smoothColor = new Color(currentColor.r, currentColor.g, currentColor.b,
Mathf.Lerp(currentColor.a, fadeAmount, fadeSpeed * Time.deltaTime));
mat.color = smoothColor;
}
foreach (Material mat in mats2)
{
Color currentColor = mat.color;
Color smoothColor = new Color(currentColor.r, currentColor.g, currentColor.b,
Mathf.Lerp(currentColor.a, fadeAmount, fadeSpeed * Time.deltaTime));
mat.color = smoothColor;
}
}
void RestFade()
{
foreach (Material mat in mats)
{
Color currentColor = mat.color;
Color smoothColor = new Color(currentColor.r, currentColor.g, currentColor.b,
Mathf.Lerp(currentColor.a, originalOpacity, fadeSpeed * Time.deltaTime));
mat.color = smoothColor;
}
foreach (Material mat in mats2)
{
Color currentColor = mat.color;
Color smoothColor = new Color(currentColor.r, currentColor.g, currentColor.b,
Mathf.Lerp(currentColor.a, originalOpacity, fadeSpeed * Time.deltaTime));
mat.color = smoothColor;
}
}
void OnTriggerEnter()
{
Debug.Log("发生了碰撞");
DoFade = false;
}
void OnTriggerExit()
{
DoFade = true;
}
}
4,将淡化速度和透明度填写上,将doFade标志位置为true,Cubes两个参数分别是要变透明的物体,拖入即可
5.相机对象添加刚体和碰撞盒两个脚本,设置如下,勾选上触发器后说明它不参与碰撞后的系统定义的操作(例如物体碰到被弹飞),而是进行自定义操作(例如这里的碰到物体改变物体透明度)如果想要加上碰撞盒和刚体后物体不弹飞,碰撞的双方都要勾选上是触发器
6.最后点击运行,如图运行效果
三,碰撞检测(直接消失,没有淡化效果)
1.场景中放置透明盒以及要出现消失的物体(该物体初始设置为不可见),如下图层级导航栏
2.透明盒下添加的脚本分别为碰撞盒和自定义脚本Hide_appear
碰撞盒脚本:勾选是触发器,表示当发生碰撞时进行自定义操作,而不是系统的物理碰撞
自定脚本Hide_appear:
主相机参数:玩家,可以是自定义的gameobject物体(在这里的玩家是相机)
appear_object:玩家碰撞时要出现的物体
Hide_appear脚本如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
public class hide_appear : MonoBehaviour
{
public GameObject MainCamera;//移动的物体,玩家
public GameObject[] appear_objects;//碰撞到要显示的物体
// Update is called once per frame
void OnTriggerStay(Collider collider)
{
Vector3 camPositionInPortalSpace = transform.InverseTransformPoint(MainCamera.transform.position);//玩家的位置
// Debug.Log("zzzzzzzzzzzzz" + camPositionInPortalSpace.z);
// Debug.Log("xxxxxxxxxxxxxx" + camPositionInPortalSpace.x);
// Debug.Log("ontrigger" + MainCamera.transform.position.y);
//此范围以被碰撞的物体为中心点设置的碰撞位置,具体可以根据被碰撞体大小进行调整
if (camPositionInPortalSpace.z < 0.7f && camPositionInPortalSpace.z > -0.7f&& camPositionInPortalSpace.x < 0.8f && camPositionInPortalSpace.x > -0.7f)
{
for (int i = 0; i < appear_objects.Length; ++i){
appear_objects[i].SetActive(true);
}
Debug.Log("++++++++++++++++appear++++++++++++++++++++++");
}
else
{
for (int i = 0; i < appear_objects.Length; ++i)
{
appear_objects[i].SetActive(false);
}
Debug.Log("-------------------hiden--------------");
}
}
}
效果如下,当相机靠近,物体出现,