私は比較的最近Unity3Dに出会いましたが、それ以前はJava2MEを使用して携帯電話用の独自のエンジンを使用していましたが、それ以外は常習者です。
新しいプラットフォームに移行するとき、私はまず自分用の既製の技術プラットフォームを探しました。私にとっての主な基準は価格(手頃な価格/正当化された)と、可能であればマルチプラットフォームでしたので、一度書かれたコードは何度も変換せずに何度も使用できます。 すぐに、Unityに出会いました。
Unity全体はすでにここで記述されているので、繰り返しません。主なことに注意してください-開発したゲームはC#でスクリプト化できます( Monoのおかげです)。 唯一の制限は、.NET Framework 1.1内で記述する必要があることです。iPhoneでのみサポートされます。 [更新:この記事の執筆中に、.NET 2.1をサポートするiPhone用Unity3Dの新しいバージョンがリリースされました]
したがって、Unity全般、特にC#を使用することで得られる主な利点は次のとおりです。
- .NET FrameworkとC#の使用(私にとっては非常に便利です)
- iPhoneおよびWebプレーヤーですぐにビルドする機能(スタンドアロンビルドは、投稿の範囲を超える多くの理由で私には魅力的ではありません)
- たとえば、XNAを使用してXBoxにゲームポートを作成するとき(変更はあるがまだ)、C#での既製の動作シナリオを再利用できます。
- ユーザーフレンドリーなインターフェースで、食いしん坊なエディターではない
- リーズナブルな価格
もちろん、デメリットもありますが、スピーチはそれらのためではありません。利点は最終的には勝っていたからです。
スクリプティングには、 Scintillaに基づいたねじ込み式のUniSciTEエディターが使用されますが 、個人的には好きではありませんでしたが、すぐに古き良きVisual Studioを使用したかったためです。 以下は、C#でスクリプトを作成する方法です。
[upd:ゲーム開発に移植]
Unityの現在のバージョンは2.6.1であり、Visual Studioとの統合に問題はありません。プロジェクトブラウザーウィンドウを右クリックし、適切なメニュー項目を選択するだけです。 その後、Unityはソリューションを作成し、既に作成されている場合は更新します。 プロジェクトには、使用されているUnityEditorおよびUnityEngineライブラリへのリンクが既に含まれており、すべてのスクリプトファイル(言語に関係なく)がプロジェクトに追加されます。
留意する必要があるもの:
- 個々のスクリプトは、ゲームエンティティの動作を記述するクラスです。 たとえば、エンティティが触れたときに「濡れている」という事実は、水分レベルを3増加させます。次に、ゲームエディタでこのエンティティを特定の水たまりにねじ込みます。 そのような各クラスはUnityEngine.MonoBehaviourクラスから継承する必要があり、これがjsスクリプトで暗示されている場合は、C#で明示的に指定する必要があります。
- Unityは名前空間を消化しません。 将来、彼らはそれを修正することを約束しますが、これまでのところ。
- クラス名とスクリプトファイル名は一致する必要があります。 Visual Studioでクラスを作成する場合は、名前空間を取得し、MonoBehaviourからクラスを継承することを忘れないでください(忘れないでください)。 Unityを介してクラスを作成する場合、デフォルトではNewBehaviourScriptという名前になります。スクリプトファイルとクラス名の両方の名前を忘れないでください。
他の微妙な点を説明するために、エンジンに付属し、FPSのようにナビゲートできる単純なスクリプトの例、つまり、wasd +ジャンプ用のスペース+マウスを用意します。 ユーザーのゲームアバターが床から落ちないようにするには、FPSWalkerエンティティを適用するときに自動的にゲームオブジェクトに付着する単純なコライダー-CharacterControllerでラップする必要があります。
// <br/>
var speed = 6.0 ; <br/>
var jumpSpeed = 8.0 ; <br/>
var gravity = 20.0 ; <br/>
<br/>
// <br/>
private var moveDirection = Vector3. zero ; <br/>
private var grounded : boolean = false ; <br/>
<br/>
// <br/>
function FixedUpdate ( ) { <br/>
// <br/>
if ( grounded ) { <br/>
// <br/>
moveDirection = new Vector3 ( Input. GetAxis ( "Horizontal" ) , 0 , Input. GetAxis ( "Vertical" ) ) ; <br/>
// <br/>
moveDirection = transform. TransformDirection ( moveDirection ) ; <br/>
// <br/>
moveDirection *= speed ; <br/>
<br/>
// - <br/>
if ( Input. GetButton ( "Jump" ) ) { <br/>
moveDirection. y = jumpSpeed ; <br/>
} <br/>
} <br/>
<br/>
// <br/>
moveDirection. y -= gravity * Time. deltaTime ; <br/>
<br/>
// <br/>
var controller : CharacterController = GetComponent ( CharacterController ) ; <br/>
// <br/>
var flags = controller. Move ( moveDirection * Time. deltaTime ) ; <br/>
// , <br/>
grounded = ( flags & CollisionFlags. CollidedBelow ) != 0 ; <br/>
} <br/>
// , , CharacterController <br/>
@ script RequireComponent ( CharacterController )
// <br/>
var speed = 6.0 ; <br/>
var jumpSpeed = 8.0 ; <br/>
var gravity = 20.0 ; <br/>
<br/>
// <br/>
private var moveDirection = Vector3. zero ; <br/>
private var grounded : boolean = false ; <br/>
<br/>
// <br/>
function FixedUpdate ( ) { <br/>
// <br/>
if ( grounded ) { <br/>
// <br/>
moveDirection = new Vector3 ( Input. GetAxis ( "Horizontal" ) , 0 , Input. GetAxis ( "Vertical" ) ) ; <br/>
// <br/>
moveDirection = transform. TransformDirection ( moveDirection ) ; <br/>
// <br/>
moveDirection *= speed ; <br/>
<br/>
// - <br/>
if ( Input. GetButton ( "Jump" ) ) { <br/>
moveDirection. y = jumpSpeed ; <br/>
} <br/>
} <br/>
<br/>
// <br/>
moveDirection. y -= gravity * Time. deltaTime ; <br/>
<br/>
// <br/>
var controller : CharacterController = GetComponent ( CharacterController ) ; <br/>
// <br/>
var flags = controller. Move ( moveDirection * Time. deltaTime ) ; <br/>
// , <br/>
grounded = ( flags & CollisionFlags. CollidedBelow ) != 0 ; <br/>
} <br/>
// , , CharacterController <br/>
@ script RequireComponent ( CharacterController )
したがって、上記に加えて、このスクリプトをC#に翻訳するときは、次のことを考慮する必要があります。
- ゲームエディターでパラメーター値を変更しますか? 次に、それらを公開します。
- CharacterControllerクラスとそのtypeofタイプ(CharacterController)を混同しないでください。
- 「@script RequireComponent(CharacterController)」などの命令はクラス属性に変わります-[RequireComponent(typeof(CharacterController))]
- 浮動小数点はfloatで表されます。ベクトルにdouble =)を掛けることもできません
- jsでは、型を明示的にキャストする必要はありませんでした。 C#はそうではありません!
- 複雑なものを初期化する必要がある場合は、既製のAwake()およびStart()関数を使用します。MonoBehaviコンストラクターをオーバーロードすることはお勧めしません
これらの単純なルールをすべて適用すると、クラスは次のようになります。
using UnityEngine ; <br/>
<br/>
// <br/>
[ RequireComponent ( typeof ( CharacterController ) ) ] <br/>
// <br/>
public class FPSWalkerInCS : MonoBehaviour { <br/>
// , float <br/>
public float speed = 6.0f ; <br/>
public float jumpSpeed = 8.0f ; <br/>
public float gravity = 20.0f ; <br/>
// - <br/>
private Vector3 moveDirection = Vector3. zero ; <br/>
private bool grounded = false ; <br/>
<br/>
// <br/>
void Start ( ) { <br/>
<br/>
} <br/>
<br/>
void FixedUpdate ( ) { <br/>
if ( grounded ) { <br/>
moveDirection = new Vector3 ( Input. GetAxis ( "Horizontal" ) , 0 , Input. GetAxis ( "Vertical" ) ) ; <br/>
moveDirection = transform. TransformDirection ( moveDirection ) ; <br/>
moveDirection *= speed ; <br/>
<br/>
if ( Input. GetButton ( "Jump" ) ) { <br/>
moveDirection. y = jumpSpeed ; <br/>
} <br/>
} <br/>
<br/>
moveDirection. y -= gravity * Time. deltaTime ; <br/>
// <br/>
CharacterController controller = ( CharacterController ) GetComponent ( typeof ( CharacterController ) ) ; <br/>
CollisionFlags flags = controller. Move ( moveDirection * Time. deltaTime ) ; <br/>
grounded = ( flags & CollisionFlags. CollidedBelow ) != 0 ; <br/>
} <br/>
}
using UnityEngine ; <br/>
<br/>
// <br/>
[ RequireComponent ( typeof ( CharacterController ) ) ] <br/>
// <br/>
public class FPSWalkerInCS : MonoBehaviour { <br/>
// , float <br/>
public float speed = 6.0f ; <br/>
public float jumpSpeed = 8.0f ; <br/>
public float gravity = 20.0f ; <br/>
// - <br/>
private Vector3 moveDirection = Vector3. zero ; <br/>
private bool grounded = false ; <br/>
<br/>
// <br/>
void Start ( ) { <br/>
<br/>
} <br/>
<br/>
void FixedUpdate ( ) { <br/>
if ( grounded ) { <br/>
moveDirection = new Vector3 ( Input. GetAxis ( "Horizontal" ) , 0 , Input. GetAxis ( "Vertical" ) ) ; <br/>
moveDirection = transform. TransformDirection ( moveDirection ) ; <br/>
moveDirection *= speed ; <br/>
<br/>
if ( Input. GetButton ( "Jump" ) ) { <br/>
moveDirection. y = jumpSpeed ; <br/>
} <br/>
} <br/>
<br/>
moveDirection. y -= gravity * Time. deltaTime ; <br/>
// <br/>
CharacterController controller = ( CharacterController ) GetComponent ( typeof ( CharacterController ) ) ; <br/>
CollisionFlags flags = controller. Move ( moveDirection * Time. deltaTime ) ; <br/>
grounded = ( flags & CollisionFlags. CollidedBelow ) != 0 ; <br/>
} <br/>
}
すべて、クラスの準備ができました。