Начало что то получаться и стало понятным как это вообще выглядет.
Решил создать такую тему для новичков, предлагаю всем Unцам выкладывать сюда примеры своих кодов и работающие проверенные скрипты
c кратким описанием функций.
Думаю будет очень полезно как примеры и не только. Разумеется то что не секретно.
Выкладываю свои наработки, доработанный скрипт FPSwalker.
- Код: Выделить всё
var speed = 10.0;
var jumpSpeed = 8.0;
var gravity = 20.0;
var runSpeed = 2.0;
var sitSpeed = 0.3;
private var moveDirection = Vector3.zero;
private var grounded : boolean = false;
function FixedUpdate() {
if (grounded) {
// We are grounded, so recalculate movedirection directly from axes
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
transform.localScale.y = 1;
}
if (Input.GetButton ("run")) {
moveDirection *= runSpeed;
transform.localPosition.y = 2.1;
transform.localScale.y = 1;
}
if (Input.GetButton ("sit")) {
transform.localScale.y = 0.5;
moveDirection *= sitSpeed;
}
}
// Apply gravity
moveDirection.y -= gravity * Time.deltaTime;
// Move the controller
var controller : CharacterController = GetComponent(CharacterController);
var flags = controller.Move(moveDirection * Time.deltaTime);
grounded = (flags & CollisionFlags.CollidedBelow) != 0;
}
@script RequireComponent(CharacterController)
Добавлено:
1. Режим бега., 2. Приседание., 3. Медленная ходьба (красться).
Доработанный скрипт MachineGun.
- Код: Выделить всё
var soundFire : AudioClip;
var soundReload : AudioClip;
var range = 100.0;
var fireRate = 0.05;
var force = 10.0;
var damage = 5.0;
var bulletsPerClip = 30;
var clips = 20;
var waitTime = 0.5;
var reloadTime = 2.6;
private var hitParticles : ParticleEmitter;
var muzzleFlash : Renderer;
private var bulletsLeft : int = 0;
private var nextFireTime = 0.0;
private var m_LastFrameShot = -1;
function Start () {
hitParticles = GetComponentInChildren(ParticleEmitter);
// We don't want to emit particles all the time, only when we hit something.
if (hitParticles)
hitParticles.emit = false;
bulletsLeft = bulletsPerClip;
}
function LateUpdate() {
audio.clip = soundFire;
if (muzzleFlash) {
// We shot this frame, enable the muzzle flash
if (m_LastFrameShot == Time.frameCount) {
animation.CrossFade("fire");
audio.clip = soundFire;
audio.Play();
muzzleFlash.transform.localRotation = Quaternion.AngleAxis(Random.value * 360, Vector3.forward);
muzzleFlash.enabled = true;
} else {
// We didn't, disable the muzzle flash
animation.CrossFade("idle");
muzzleFlash.enabled = false;
enabled = false;
}
}
}
function Fire () {
if (bulletsLeft == 0)
return;
// If there is more than one bullet between the last and this frame
// Reset the nextFireTime
if (Time.time - fireRate > nextFireTime)
nextFireTime = Time.time - Time.deltaTime;
// Keep firing until we used up the fire time
while( nextFireTime < Time.time && bulletsLeft != 0) {
FireOneShot();
nextFireTime += fireRate;
}
}
function FireOneShot () {
var direction = transform.TransformDirection(Vector3.forward);
var hit : RaycastHit;
// Did we hit anything?
if (Physics.Raycast (transform.position, direction, hit, range)) {
// Apply a force to the rigidbody we hit
if (hit.rigidbody)
hit.rigidbody.AddForceAtPosition(force * direction, hit.point);
// Place the particle system for spawing out of place where we hit the surface!
// And spawn a couple of particles
if (hitParticles) {
hitParticles.transform.position = hit.point;
hitParticles.transform.rotation = Quaternion.FromToRotation(Vector3.up, hit.normal);
hitParticles.Emit();
}
// Send a damage message to the hit object
hit.collider.SendMessageUpwards("ApplyDamage", damage, SendMessageOptions.DontRequireReceiver);
}
bulletsLeft--;
// Register that we shot this frame,
// so that the LateUpdate function enabled the muzzleflash renderer for one frame
m_LastFrameShot = Time.frameCount;
enabled = true;
// Reload gun in reload Time
if (Input.GetButton ("reload"))
Reload();
if (bulletsLeft == 0)
Reload();
}
function Reload () {
// Wait for reload time first - then add more bullets!
yield WaitForSeconds(waitTime);
animation.CrossFade("reload");
yield WaitForSeconds(waitTime);
audio.clip = soundReload;
audio.Play();
yield WaitForSeconds(reloadTime);
animation.CrossFade("idle");
// We have a clip left reload
if (clips > 0) {
clips--;
bulletsLeft = bulletsPerClip;
}
}
function GetBulletsLeft () {
return bulletsLeft;
}
Добавлено:
1. Работа с двумя анимациями (idle и reload)., 2. Проигрывается два звука (при выстреле и при перезарядке).