Cull Off
, подробнее про куллинг можно почитать здесь. Нужную вам прозрачность можно получить с помощью alpha:fade
, если говорить про surface-шейдеры, с другими шейдерами будет немного сложнее. Ниже обычный шаблон шейдера, который я немного подчистил и добавил две недостающие инструкции.Shader "Custom/NewSurfaceShader"
{
Properties
{
_Color("Color", Color) = (1,1,1,1)
_MainTex("Albedo (RGB)", 2D) = "white" {}
_Glossiness("Smoothness", Range(0,1)) = 0.5
_Metallic("Metallic", Range(0,1)) = 0.0
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD 200
// Выключаем куллинг, чтобы меш рисовался с двух сторон
Cull Off
CGPROGRAM
// По с равнению со стандартным шаблоном в конце добавилось "alpha:fade" для получения прозрачности
#pragma surface surf Standard fullforwardshadows alpha:fade
#pragma target 3.0
struct Input
{
float2 uv_MainTex;
};
fixed4 _Color;
sampler2D _MainTex;
half _Glossiness;
half _Metallic;
void surf(Input IN, inout SurfaceOutputStandard o)
{
fixed4 color = tex2D (_MainTex, IN.uv_MainTex)*_Color;
o.Albedo = color.rgb;
o.Metallic = _Metallic;
o.Smoothness = _Glossiness;
o.Alpha = color.a;
}
ENDCG
}
FallBack "Diffuse"
}
_MainTex_ST
, это Vector4, менять его можно с помощью Material.SetVector либо MaterialPropertyBlock.SetVector. if(transform)
. Связано появление этого оператора с тем, что объекты живут не только в шарповом коде, но и в плюсовой части движка. То есть в шарпе объект может быть не null, а в плюсовой части уже уничтожился, и наоборот. Но это было актуально пару лет назад, с тех пор они бэкэнд переписывали и проблем с этим я уже давно не наблюдал, считайте, что это просто остатки легаси кода. Ещё иногда про это спрашивают на собеседованиях, но это скорее мусорные знания, дизайн так себе. using UnityEngine;
public class LineExample : MonoBehaviour
{
public LineRenderer lineRenderer;
public Transform a;
public Transform b;
public float sphereRadius = 0.5f;
public int positionCount = 10;
private void Awake()
{
Vector3 aDirection = transform.InverseTransformPoint(a.position).normalized;
Vector3 bDirection = transform.InverseTransformPoint(b.position).normalized;
var fromRotation = Quaternion.identity;
var toRotation = Quaternion.FromToRotation(aDirection, bDirection);
lineRenderer.positionCount = positionCount;
for (int i = 0; i < positionCount; i++)
{
float t = i/(positionCount - 1f);
Quaternion rotation = Quaternion.Lerp(fromRotation, toRotation, t);
Vector3 point = rotation*aDirection*sphereRadius;
lineRenderer.SetPosition(i, point);
}
}
}