0

Unity3D 5 を使用して Train Simulator を作成しています。曲線ではスムーズに貨車を曲げ、直線では元に戻したいのですが、どうすればよいですか?

Hermite Spline Controller C# バージョンを使用していますが、

ここにコードがあります。

using UnityEngine;
using System.Collections;

public class BendTrain : MonoBehaviour {

    public Transform trainwagon2;
    public Transform trainwagon3;
    public Transform waypoint2;
    public Transform waypoint3;
    public static bool t2 = false;
    public static bool t3 = false;

    void OnTriggerEnter (Collider col1)
    {

                if (col1.tag == "b2") {
                    t2=true;
                }


                if (col1.tag == "b3") {
                    t3=true;
                }
    }

    void Update ()
    {
        if (t2)
        trainwagon2.transform.rotation = Quaternion.RotateTowards(trainwagon2.transform.rotation, waypoint2.rotation, 2);

        if (t3)
        trainwagon3.transform.rotation = Quaternion.RotateTowards(trainwagon2.transform.rotation, waypoint2.rotation, 2);

    }
}
4

1 に答える 1

0

これはかなりトリッキーです。私は自分でこれを行ったことはありませんが、これを行う方法の基本的な考え方は次のとおりです。

  1. 曲線の始点と終点から距離を計算します。
  2. カーブ シェーダーを使用して、それに応じて列車オブジェクトを曲げます。
  3. オブジェクトがカーブ パスにあるときにこのシェーダを適用するスクリプトを作成し、後で削除する必要があります。

以下は、開始するためのサンプル (テストされていない) コードです。

Shader "Custom/Curved" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _QOffset ("Offset", Vector) = (0,0,0,0) _Brightness ("Brightness", Float) = 0.0 _Dist ("Distance", Float) = 100.0 }

 SubShader {
     Tags { "Queue" = "Transparent"}
     Pass
     {

         Blend SrcAlpha OneMinusSrcAlpha 
         CGPROGRAM
         #pragma vertex vert
         #pragma fragment frag
         #include "UnityCG.cginc"


         sampler2D _MainTex;
         float4 _QOffset;
         float _Dist;
         float _Brightness;

         struct v2f {
             float4 pos : SV_POSITION;
             float4 uv : TEXCOORD0;
             float3 viewDir : TEXCOORD1;
             fixed4 color : COLOR;
         };
         v2f vert (appdata_full v)
         {
            v2f o;
            float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
            float zOff = vPos.z/_Dist;
            vPos += _QOffset*zOff*zOff;
            o.pos = mul (UNITY_MATRIX_P, vPos);
            o.uv = v.texcoord;
            return o;
         }
         half4 frag (v2f i) : COLOR0
         {
               half4 col = tex2D(_MainTex, i.uv.xy);
               col *= UNITY_LIGHTMODEL_AMBIENT*_Brightness;
             return col;
         }
         ENDCG
     }
 }

 FallBack "Diffuse"

参考文献:

https://alastaira.wordpress.com/2013/10/25/animal-crossing-curved-world-shader/

http://forum.unity3d.com/threads/problem-with-bending-terrain-shader.229605/

https://alastaira.wordpress.com/2013/10/25/animal-crossing-curved-world-shader/

http://answers.unity3d.com/questions/288835/how-to-make-plane-look-curved.html

これがヒントになることを願っています。

于 2016-09-23T12:38:58.540 に答える