protected override void fire(_Shoot3 shoot, _Weapon3 wapon) { var pos = wapon.tfMuzzle.position; var rot = wapon.tfMuzzle.rotation; var tfMuzzle = wapon.tf.childCount > 0 ? wapon.tf.GetChild(0) : wapon.tfMuzzle; for (var i = 0; i < numberOfBullets; i++) { Random.seed = i; var noiseAngle = Random.insideUnitCircle * lowAccuracy; var rotNoize = Quaternion.Euler(-emitAngle + noiseAngle.x, noiseAngle.y, 0.0f); bullet.emit(pos, rot * rotNoize, barralFactor, 1.0f, 0, shoot.act, tfMuzzle); } sound.Play(); if (flash != null) { flash.Emit(1); } }
public override _Weapon3.enWaponState excute(_Shoot3 shoot, _Weapon3 wapon, _Weapon3.TriggerUnit trigger) { if (shoot.isScopeable & trigger.press) { wapon.sound.PlayOneShot(zoomSound); if (isScopeMode) { zoomOff(shoot); } else { zoomOn(shoot); } return(_Weapon3.enWaponState.excuting); } else { var progress = wapon.reloadRemainingTime * wapon.maxReloadTimeR; if (progress == 1.0f) { zoomOff(shoot); } return(_Weapon3.enWaponState.ready); } }
// 武器それぞれの「表示・表示の位置」をあらかじめ計算して配列に保存しておく。 public void showVisual(_Weapon3 wapon, int id, bool isToShow) // 指定の武器を、指定の視覚状態で表示する。の位置は各自配列に持っているので、そこに移動するだけ。 { var goalpos = isToShow ? visualPositions[id].show : visualPositions[id].hide; var nowpos = visualPositions[id].now; var isGoaled = (goalpos - nowpos).sqrMagnitude < 0.05f * 0.05f; if (isToShow || !isGoaled) { if (!isGoaled) { visualPositions[id].now += (goalpos - nowpos) * 0.5f * GM.t.delta * 30.0f; } var mt = new Matrix4x4(); mt.SetTRS(visualPositions[id].now, visualRotation, visualPositions[id].scale); Graphics.DrawMesh(wapon.mf.sharedMesh, mt, wapon.mr.material, UserLayer._userInterface, GM.cameras.iface); } }
public override _Weapon3.enWaponState excute(_Shoot3 shoot, _Weapon3 wapon, _Weapon3.TriggerUnit trigger) { if (wapon.reloadRemainingTime > 0.0f) { return(_Weapon3.enWaponState.reloading); } else { if (bulletRemaining == 0) { bulletRemaining = maxBullets; } var state = base.excute(shoot, wapon, trigger); if ((state & _Weapon3.enWaponState.enterReload) != 0) { if (wapon.reloadRemainingTime == 0.0f) { wapon.maxReloadTimeR = 1.0f / reloadTime; } wapon.reloadRemainingTime += reloadTime; } return(state); } }
void showReloadBar(_Weapon3 wapon) { //if( !isShowReloadingBar ) { var progress = wapon.reloadRemainingTime * wapon.maxReloadTimeR; tfSite.localScale = new Vector3(progress, 0.1f, 1.0f); mr.sharedMaterial = matProgress; isShowReloadingBar = true; } }
public override _Weapon3.enWaponState excute(_Shoot3 shoot, _Weapon3 wapon, _Weapon3.TriggerUnit trigger) { if (!shoot.isShootable) { trigger = new _Weapon3.TriggerUnit(); } if (Time.time > fireReadyTime) { /*if( wapon.reloadRemainingTime > 0.0f ) * { * * return _Wapon3.enWaponState.reloading; * * } * else */if (triggerRagTime > 0.0f && trigger.press) { fireReadyTime = Time.time + triggerRagTime; } else if (trigger.push) { fire(shoot, wapon); if (--bulletRemaining > 0) { fireReadyTime = Time.time + nextFireTime; // - ( Time.time - fireReadyTime ); return(_Weapon3.enWaponState.excuting); } else { fireReadyTime = 0.0f; return(_Weapon3.enWaponState.enterReload | _Weapon3.enWaponState.excuting); } } else { return(_Weapon3.enWaponState.ready); } } return(_Weapon3.enWaponState.busy); }
public bool show(_Weapon3 wapon, bool isReloading) { var toggle = isShowReloadingBar ^ isReloading; if (isReloading) { showReloadBar(wapon); } else { showSite(); } return(toggle); }
protected virtual void fire(_Shoot3 shoot, _Weapon3 wapon) { var noiseAngle = Random.insideUnitCircle * lowAccuracy; var pos = wapon.tfMuzzle.position; var rot = wapon.tfMuzzle.rotation * Quaternion.Euler(-emitAngle + noiseAngle.x, noiseAngle.y, 0.0f); bullet.emit(pos, rot, barralFactor, 1.0f, 0, shoot.act, wapon.tf.childCount > 0 ? wapon.tf.GetChild(0) : wapon.tfMuzzle); sound.Play(); if (flash != null) { flash.Emit(1); } }
Vector3 calculateShootLine(_Weapon3 wapon) { var pos = wapon.tfMuzzle.position; var line = migration.targetPoint - pos; if (finder.target.isExists) { var actpos = finder.target.act.tfObservedCenter.position; var aline = actpos - pos; var reach = figure.bodyRadius * 3.0f; if (aline.sqrMagnitude < reach * reach) { // あまりにも近い場合は誤差なしで line = aline; } else { var up = rb.rotation * Vector3.up; var ad = Vector3.Dot(up, aline); if (ad >= 0.0f) { // 実際に相手が地面の下にいるわけではない var d = Vector3.Dot(up, line); if (d < 0.0f) { line -= up * d; // 地面にめり込む場合は補正する } } } } return(line); }
public void renewalText(_Weapon3 wapon, bool isRenewal) { if (isRenewal) { infoString.Length = 0; foreach (var unit in wapon.units) { unit.renewalInfoText(infoString); infoString.AppendLine(); } infoString.Append(wapon.waponName); infomationText.text = infoString.ToString(); } }
public void showVisual(_Weapon3 wapon) // 使用していないが、参考として残しておく。シンプルに表示するだけ。 { var mt = new Matrix4x4(); var scale = new Vector3(1.0f, 1.0f, 0.55f); scale = Vector3.Scale(scale, wapon.tf.localScale); var x = (GM.cameras.iface.aspect - 0.05f) - wapon.mf.sharedMesh.bounds.max.z * scale.z * 0.7f; // 左端が -1.0f * aspect 右端が 1.0f * acpect var y = (-1.0f + 0.05f) - wapon.mf.sharedMesh.bounds.min.y * scale.y * 2.0f; // 上端が 1.0f 下端が -1.0f 最後の定数値は斜め表示の係数(0.7f と 2.0f)。 var pos = new Vector3(x, y, 2.0f); var rot = Quaternion.Euler(new Vector3(320.0f, 90.0f, 0.0f)); mt.SetTRS(pos, rot, scale); Graphics.DrawMesh(wapon.mf.sharedMesh, mt, wapon.mr.material, UserLayer._userInterface, GM.cameras.iface); }
public override void leave(_Shoot3 shoot, _Weapon3 wapon) { zoomOff(shoot); }
public override void ready(_Shoot3 shoot, _Weapon3 wapon) { var readyTime = Time.time + wapon.readyTime; fireReadyTime = readyTime > fireReadyTime ? readyTime : fireReadyTime; }
public virtual void leave(_Shoot3 shoot, _Weapon3 wapon) { }
public virtual void ready(_Shoot3 shoot, _Weapon3 wapon) { }
public abstract _Weapon3.enWaponState excute(_Shoot3 shoot, _Weapon3 wapon, _Weapon3.TriggerUnit trigger);