プログラミング学校の教材。パート17
以前のチュートリアルはここにあります:
このプロジェクトでは、作業のプロセスを検討します。
レイキャストとベクトルを使用します。
他のカスタムクラスのメソッドを使用します。
コードを介してAudioSourceおよびRigidbodyを使用します。
プレイヤーに心理的に影響を与えるショットの3つの主要コンポーネント(音、光と輝き、アニメーション、ショットの軌跡)。
プレハブのインスタンス化。
プロジェクトの主要なテーマは、正確にはレイキャストとベクトルです。後者は、毎日かなりの時間を費やし、簡単な例でどのように機能するかを説明する必要があります。しかし、学生と一緒にプロジェクトを迅速に完了することができた場合は、このレッスンでメカニムシステムを検討するのが適切です。
実行順序
新しいプロジェクトを作成し、添付されたアセットをインポートします。
標準のリソースに加えて、パッケージにはデカールをペイントするためのサードパーティのプラグインが含まれています。彼の仕事は、このレッスンの文脈ではカバーされていません。
レッスンプロジェクトは、射撃場と手榴弾の2つの部分に分かれています。
射撃場
- . , , , , .
, , .
DecalShooter, , , . .
, . , Y , CapsuleCollider MeshCollider Convex. , , point light, , AudioSource , Rigidbody Continius Dynamic isKinematik. AudioSource PlayOnAwake .
Target, .
, . .
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Target : MonoBehaviour {
public GameObject light;
public Rigidbody rig;
public AudioSource src;
bool enabled = true;
// Use this for initialization
void Start() {
rig = GetComponent<Rigidbody>();
src = GetComponent<AudioSource>();
}
// Update is called once per frame
void Update() {
}
public void shoot() {
if (!enabled) {
return;
}
rig.isKinematic = false;
light.SetActive(false);
src.Play();
enabled = false;
}
}
shoot, , . - DecalShooter shoot. :
if (Input.GetKeyDown(KeyCode.Mouse0)) {
time = 0.3f;
ShootSource.Play();
anim.Play("fire");
Muzzleflash.SetActive(true);
//
RaycastHit hitInfo;
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, out hitInfo, 100f)) {
GameObject go = Instantiate(
DecalPrefab,
hitInfo.point,
Quaternion.LookRotation(
Vector3.Slerp(-hitInfo.normal, fwd, normalization)
)
) as GameObject;
go.GetComponent<DecalUpdater>().UpdateDecalTo(
hitInfo.collider.gameObject,
true
);
Vector3 explosionPos = hitInfo.point;
Target trg = hitInfo.collider.GetComponent<Target>();
if (trg) {
trg.shoot();
}
Rigidbody rb = hitInfo.collider.GetComponent<Rigidbody>();
if (rb != null) {
rb.AddForceAtPosition(fwd * power, hitInfo.point, ForceMode.Impulse);
Debug.Log("rb!");
}
}
//
}
hitInfo , , shoot. , , . , . , , . Target :
light.SetActive(false);
light.GetComponent<Light>().color = Color.red;
, .
.
, - .
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Lenght : MonoBehaviour {
public Text Dalnost;
float rasstoyanie = 0; //
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
RaycastHit hitInfo;
if (Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), out hitInfo, 200)) {
rasstoyanie = hitInfo.distance;
Dalnost.text = rasstoyanie.ToString();
}
}
}
FPScontroller/FirstPersonCharacter. Canvas , .
, , .
.
- . , . , .
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Length : MonoBehaviour {
public Text Dalnost;
float rasstoyanie = 0; //
public GameObject sharik;
// Use this for initialization
void Start() {
}
// Update is called once per frame
void Update() {
RaycastHit hitInfo;
if(Physics.Raycast(transform.position, transform.TransformDirection(Vector3.forward), outhitInfo, 200)) {
rasstoyanie = hitInfo.distance;
Dalnost.text = rasstoyanie.ToString ();
if(Input.GetKeyDown(KeyCode.Mouse1)) {
GameObject go = Instantiate(
sharik,
transform.position + Vector3.Normalize(hitInfo.point - transform.position),
transform.rotation
);
Rigidbody rig = go.GetComponent<Rigidbody>();
rig.velocity = Vector3.Normalize(hitInfo.point - transform.position) * 10;
}
}
}
}
- ? , . . .. , , . . Grenade.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Grenade : MonoBehaviour {
public Transform explosionPrefab;
void OnCollisionEnter(Collision collision) {
ContactPoint contact = collision.contacts[0];
// Rotate the object so that the y-axis faces along the normal of the surface
Quaternion rot = Quaternion.FromToRotation(Vector3.up, contact.normal);
Vector3 pos = contact.point;
Instantiate(explosionPrefab, pos, rot);
Destroy(gameObject);
}
}
, Body Convex, RIgidbody . .
, , , .
. , AudioSource PlayOnAwake , Spital Blend 90 3 .
リジッドボディのすべての効果と拡散を正しく実行するには、別のスクリプトを作成する必要があります。これを爆発と呼びます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Explosion : MonoBehaviour {
public float radius = 5.0f;
public float power = 10.0f;
public GameObject svet;
void Start() {
Destroy(svet, 0.1f);
Vector3 explosionPos = transform.position;
Collider[] colliders = Physics.OverlapSphere(explosionPos, radius);
foreach(Collider hit in colliders) {
Rigidbodyrb = hit.GetComponent<Rigidbody>();
if (rb != null) {
rb.AddExplosionForce(power, explosionPos, radius, 3.0f);
}
}
}
}
爆発効果にそれを投げて、プレハブを作成する必要があります。
このプレハブは、爆発を作成するために手榴弾スクリプトで使用されます。
完了しました。