天津23维预案
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

273 lines
8.4 KiB

using UnityEngine;
using System.Collections;
public class WaterControl : MonoBehaviour
{
Transform waterStartTran;//喷口
public float height_y = 0.6f;
private GameObject Obj_ShuiLiu;
private GameObject Obj_ShuiHua;
public int Times;
void Start()
{
waterStartTran = transform.parent;
Obj_ShuiHua = transform.Find("ShuiHua").gameObject;
Obj_ShuiLiu = transform.Find("ShuiLiu").gameObject;
disableFall();
}
// Update is called once per frame
void Update()
{
Ray ray = new Ray(waterStartTran.position, new Vector3(waterStartTran.forward.x, waterStartTran.forward.y * 0.6f, waterStartTran.forward.z) * 15);
RaycastHit hitinfo;
if (Physics.Raycast(ray, out hitinfo))
{//当射线射到罐槽时,说明水炮打到水罐上了,产生水流特效
activeFall(hitinfo, hitinfo.collider.name);
}
else
{
disableFall();
}
}
void activeFall(RaycastHit hitinfo, string name)
{
Ray rayShuiHua;
#region 球罐
if (name.Contains("XF_QG"))
{
if (hitinfo.point.y > -0.9 && hitinfo.point.y < 2.7f)
{
Obj_ShuiLiu.transform.position = hitinfo.point;
if (hitinfo.point.y > 0)
{
rayShuiHua = new Ray(hitinfo.point, calShuiHuaPos(hitinfo) * 15);
checkShuiHuaPos(rayShuiHua);
}
if (hitinfo.point.y == 0)
{
rayShuiHua = new Ray(hitinfo.point, calShuiHuaPos(hitinfo));
checkShuiHuaPos(rayShuiHua);
}
if (hitinfo.point.y < 0)
{
rayShuiHua = new Ray(hitinfo.point, new Vector3(0, hitinfo.point.y, 0) * 15);
checkShuiHuaPos(rayShuiHua);
}
}
else
{
disableFall();
}
}
#endregion
#region 浮顶罐
if (name.Contains("XF_WFD"))
{//浮顶罐
if (hitinfo.point.y > -3 && hitinfo.point.y <= -2)
{
checkShuiHuaPos(new Ray(hitinfo.point, new Vector3(0, hitinfo.point.y, 0)));
Obj_ShuiLiu.SetActive(false);
}
else if (hitinfo.point.y > -2 && hitinfo.point.y < 0)
{
Vector3 vec_Land = (hitinfo.point - waterStartTran.position);
Ray rayLand = new Ray(hitinfo.point, new Vector3(0, hitinfo.point.y, 0) * 15);
RaycastHit hitLand;
if (Physics.Raycast(rayLand, out hitLand))
{
if (hitLand.collider.name.Contains("XF_DM_2"))
{//"XF_DM"----地面
Vector3 vec_Repeat = hitLand.point - waterStartTran.position;
Vector3 vec = vec_Repeat + vec_Land;
for (int i = 0; i < 3; i++)
{
vec = vec + vec_Land;
}
Ray rayFallFix = new Ray(waterStartTran.position, vec.normalized * 12);
RaycastHit hitFallFixed;
if (Physics.Raycast(rayFallFix, out hitFallFixed))
{
if (hitFallFixed.collider.name.Contains("XF_WFD"))
{
Obj_ShuiLiu.transform.position = hitFallFixed.point;
checkShuiHuaPos(new Ray(hitFallFixed.point, new Vector3(0, hitFallFixed.point.y, 0)));
}
else
{
disableFall();
}
}
}
}
else
{
disableFall();
}
}
else if (hitinfo.point.y >= 0 && hitinfo.point.y < 1.42)
{
Obj_ShuiLiu.transform.position = hitinfo.point;
rayShuiHua = new Ray(hitinfo.point, calShuiHuaPos(hitinfo) * 12);
checkShuiHuaPos(rayShuiHua);
}
else
{
disableFall();
}
}
#endregion
#region 拱顶罐
if (name.Contains("guan"))
{
if (hitinfo.point.y > 0)
{
rayShuiHua = new Ray(hitinfo.point, new Vector3(0, -hitinfo.point.y, 0) * 20);
Debug.DrawRay(hitinfo.point, new Vector3(0,- hitinfo.point.y, 0) * 10, Color.yellow, 1f);
}
else {
rayShuiHua = new Ray(hitinfo.point, new Vector3(0, hitinfo.point.y, 0) * 20);
Debug.DrawRay(hitinfo.point, new Vector3(0, hitinfo.point.y, 0) * 10, Color.yellow, 1f);
}
RaycastHit hitLand;
if (Physics.Raycast(rayShuiHua, out hitLand))
{
if (hitLand.collider.name.Contains("XF_DM_2"))
{
Obj_ShuiHua.transform.position = hitLand.point;
}
}
if (hitinfo.point.y > -3 && hitinfo.point.y < -1.5)
{
Obj_ShuiLiu.transform.position = hitinfo.point;
Obj_ShuiLiu.SetActive(true);
Obj_ShuiHua.SetActive(true);
}
else if (hitinfo.point.y >= -1.5 && hitinfo.point.y < 4.0)
{
Vector3 vec;
if (Physics.Raycast(rayShuiHua, out hitLand))
{
if (hitLand.collider.name.Contains("XF_DM_2"))
{
Vector3 vec_Vertical = (hitinfo.point - hitLand.point).normalized;
Vector3 vec_Once = hitinfo.point - waterStartTran.position;
vec = vec_Once*10+ vec_Vertical;
Ray rayShuiHuaFix = new Ray(waterStartTran.position, vec);
Debug.DrawRay(waterStartTran.position, vec, Color.blue, 1f);
RaycastHit hitShuiHuaFix;
if (Physics.Raycast(rayShuiHuaFix,out hitShuiHuaFix))
{
if (hitShuiHuaFix.collider.name.Contains("guan"))
{
Obj_ShuiLiu.transform.position = hitShuiHuaFix.point;
Obj_ShuiLiu.SetActive(true);
Obj_ShuiHua.SetActive(true);
}
}
}
}
}
else
{
disableFall();
}
Debug.DrawRay(waterStartTran.position, (hitinfo.point - waterStartTran.position), Color.red, 1f);
}
#endregion
}
/// <summary>
/// 不开启水花
/// </summary>
void disableFall()
{//关闭水流组件
Obj_ShuiHua.SetActive(false);
Obj_ShuiLiu.SetActive(false);
}
/// <summary>
/// 确定水炮射击球罐时下落水花的最终位置
/// </summary>
/// <param name="ray"></param>
void checkShuiHuaPos(Ray ray)
{
RaycastHit hitinfoShuiHua;
if (Physics.Raycast(ray, out hitinfoShuiHua))
{
if (hitinfoShuiHua.collider.name.Contains("XF_DM_2"))
{//"XF_DM_2"----地面
Obj_ShuiHua.transform.position = hitinfoShuiHua.point;
}
}
Obj_ShuiHua.gameObject.SetActive(true);
Obj_ShuiLiu.gameObject.SetActive(true);
}
/// <summary>
/// 水花的最终落点位置
/// </summary>
/// <param name="hitinfo"></param>
/// <returns></returns>
Vector3 calShuiHuaPos(RaycastHit hitinfo)
{
Vector3 vec;
Vector3 vec_Repeat = new Vector3(0, -hitinfo.point.y, 0);
Vector3 vec_Mother = (waterStartTran.position - hitinfo.point);
if (hitinfo.point.y > 0)
{
Times = 3;
vec = vec_Repeat.normalized + vec_Mother.normalized;
}
else
{
vec = vec_Mother + vec_Repeat;
Times = 5;
}
for (int i = 0; i < Times; i++)
{
vec = vec + vec_Repeat.normalized;
}
return vec;
}
}