Files
MinFt/Client/Assets/Plugins/WaterCausticsModules/WaterCausticsEffect/Effect/Scripts/AtOnce.cs
Liubing\LB 3d8d4d18f3 first commit
先修复一下,错误的场景

删除不必要的钓场资产

修复into场景

update:更新meta文件,修复报错

update:修复资源

修复第一章节建造

修复建造第三章

update:删除多余内容

update:更新README.md

update:还原图标

update:更新README

update:更新配置
2026-04-28 02:17:22 +08:00

129 lines
5.1 KiB
C#

// WaterCausticsModules
// Copyright (c) 2021 Masataka Hakozaki
#if WCE_URP
using System.Collections.Generic;
using MH.WaterCausticsModules.Effect;
using UnityEngine;
using UnityEngine.Rendering;
namespace MH.WaterCausticsModules {
[ExecuteAlways]
[DisallowMultipleComponent]
[AddComponentMenu ("")]
internal class AtOnce : MonoBehaviour {
private WaterCausticsEffect _summoner;
private MeshRenderer _render;
internal MeshRenderer render => _render;
private void setRenderEnable (bool isOn) {
if (_render && _render.enabled != isOn) _render.enabled = isOn;
}
private bool _inited;
private AtOnce init (WaterCausticsEffect summoner, Material mat) {
_inited = true;
_summoner = summoner;
var mf = gameObject.AddComponent<MeshFilter> ();
mf.sharedMesh = getMesh ();
_render = gameObject.AddComponent<MeshRenderer> ();
_render.sharedMaterial = mat;
_render.shadowCastingMode = ShadowCastingMode.Off;
_render.lightProbeUsage = LightProbeUsage.Off;
_render.reflectionProbeUsage = ReflectionProbeUsage.Off;
_render.allowOcclusionWhenDynamic = true;
_render.receiveShadows = true;
updateTransform ();
// -- HideFlags --
gameObject.hideFlags = HideFlags.HideAndDontSave | HideFlags.HideInInspector;
// gameObject.hideFlags &= (~HideFlags.HideInHierarchy); // デバッグ用 Hierarchyで表示
// ---------------
return this;
}
private void OnDisable () {
setRenderEnable (false);
}
private void OnDestroy () {
destroy (ref __mesh);
}
private void LateUpdate () {
if (!_summoner || !_summoner.isActiveAndEnabled || _summoner.method != Method.AtOnce) {
setRenderEnable (false);
} else {
setRenderEnable (true);
updateTransform ();
}
}
private void updateTransform () {
if (gameObject.layer != _summoner.gameObject.layer)
gameObject.layer = _summoner.gameObject.layer;
var sumTra = _summoner.transform;
if (transform.parent != sumTra.parent)
transform.SetParent (sumTra.parent, worldPositionStays : false);
if (transform.localToWorldMatrix != sumTra.localToWorldMatrix) {
transform.localPosition = sumTra.localPosition;
transform.localRotation = sumTra.localRotation;
transform.localScale = sumTra.localScale;
}
}
private void Update () {
bool isLeaked = (!_inited || !_summoner || _summoner.atOnce != this);
if (isLeaked) destroy (gameObject);
}
// ----------------------------------------------------------- Mesh
private Mesh __mesh;
private Mesh getMesh () {
if (!__mesh) {
Mesh m = new Mesh ();
m.name = "WCEMeshForAtOnce";
m.vertices = new Vector3 [] { new Vector3 (-.5f, -.5f, -.5f), new Vector3 (.5f, -.5f, -.5f), new Vector3 (-.5f, .5f, -.5f), new Vector3 (.5f, .5f, -.5f), new Vector3 (-.5f, -.5f, .5f), new Vector3 (.5f, -.5f, .5f), new Vector3 (-.5f, .5f, .5f), new Vector3 (.5f, .5f, .5f), /* */ Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero, Vector3.zero };
m.triangles = new int [] { 2, 6, 7, 2, 7, 3, 0, 2, 3, 0, 3, 1, 1, 3, 7, 1, 7, 5, 0, 4, 6, 0, 6, 2, 4, 5, 7, 4, 7, 6, 0, 1, 5, 0, 5, 4, /* */ 15, 8, 9, 15, 9, 10, 15, 10, 11, 15, 11, 12, 15, 12, 13, 15, 13, 14 };
m.bounds = new Bounds (Vector3.zero, Vector3.one);
m.hideFlags = HideFlags.HideAndDontSave;
m.UploadMeshData (markNoLongerReadable: true);
__mesh = m;
}
return __mesh;
}
// ----------------------------------------------------------- Static
static internal AtOnce Create (WaterCausticsEffect summoner, Material mat) {
var name = "(WCE Renderer) (Deletable)";
var go = new GameObject (name);
go.SetActive (false); // ← Flags設定時にOnEnable,OnDisableが呼ばれる不具合の回避
var a = go.AddComponent<AtOnce> ().init (summoner, mat);
go.SetActive (true);
return a;
}
static internal void OnSummonerDestroyed (ref AtOnce a) {
if (a == null) return;
destroy (a.gameObject);
a = null;
}
static private void destroy<T> (ref T o) where T : Object {
if (o == null) return;
destroy (o);
o = null;
}
static private void destroy (Object o) {
if (o == null) return;
if (Application.isPlaying)
Destroy (o);
else
DestroyImmediate (o);
}
// -----------------------------------------------------------
}
}
#endif // End of WCE_URP