310 lines
9.1 KiB
C#
310 lines
9.1 KiB
C#
|
|
using DG.Tweening;
|
|||
|
|
using Sirenix.OdinInspector;
|
|||
|
|
using System.Collections;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// NPCCar
|
|||
|
|
/// </summary>
|
|||
|
|
public class NPCCar : Car
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public int index;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private string skinCarIndex;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private bool isChangeLanes;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public Transform carNode;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private E_DirectionType e_DirectionType;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ·<><C2B7>
|
|||
|
|
/// </summary>
|
|||
|
|
private SectionRoad sectionRoad;
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ת<><D7AA><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
|||
|
|
/// </summary>
|
|||
|
|
private Coroutine indicatorCoroutine;
|
|||
|
|
|
|||
|
|
private void OnEnable()
|
|||
|
|
{
|
|||
|
|
isChangeLanes = false;
|
|||
|
|
rb.useGravity = false;
|
|||
|
|
rb.isKinematic = true;
|
|||
|
|
rb.velocity = Vector3.zero;
|
|||
|
|
isDie = false;
|
|||
|
|
if (indicatorCoroutine != null)
|
|||
|
|
{
|
|||
|
|
StopCoroutine(indicatorCoroutine);
|
|||
|
|
indicatorCoroutine = null;
|
|||
|
|
}
|
|||
|
|
carNode.transform.DOKill();
|
|||
|
|
carNode.transform.localEulerAngles = Vector3.zero;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Start()
|
|||
|
|
{
|
|||
|
|
Init();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ʼ<EFBFBD><CABC>
|
|||
|
|
/// </summary>
|
|||
|
|
public void Init()
|
|||
|
|
{
|
|||
|
|
if(skinCarIndex==null)
|
|||
|
|
{
|
|||
|
|
skinCarIndex = "Car_" + Random.Range(1, 25);
|
|||
|
|
}
|
|||
|
|
skinCar = Instantiate(YooAssetManager.Instance.LoadAssetSync<GameObject>(PackagesName.GameData, skinCarIndex).GetComponent<SkinCar>());
|
|||
|
|
skinCar.transform.SetParent(carNode);
|
|||
|
|
skinCar.transform.localPosition = Vector3.zero;
|
|||
|
|
skinCar.transform.localEulerAngles = Vector3.zero;
|
|||
|
|
e_carSizeType = ConfigManager.Instance.GetE_CarSizeType(skinCarIndex);
|
|||
|
|
SetColl();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>Ƥ<EFBFBD><C6A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void SetSkinCar(string car)
|
|||
|
|
{
|
|||
|
|
skinCarIndex = car;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void SetData(int index, SectionRoad sectionRoad)
|
|||
|
|
{
|
|||
|
|
this.index = index;
|
|||
|
|
this.sectionRoad = sectionRoad;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void Update()
|
|||
|
|
{
|
|||
|
|
ChangeLanes();
|
|||
|
|
AllowRightWay();
|
|||
|
|
Forward();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private void ChangeLanes()
|
|||
|
|
{
|
|||
|
|
if (Vector3.Distance(Scenes.Instance.player.transform.position, this.transform.position) < 150 && !Scenes.Instance.player.isAmbulance && !Scenes.Instance.player.isSprint)
|
|||
|
|
{
|
|||
|
|
if (isChangeLanes)
|
|||
|
|
{
|
|||
|
|
if (IsObjectOnLeft(Scenes.Instance.player.gameObject,this.transform.gameObject))
|
|||
|
|
{
|
|||
|
|
if (this.index==sectionRoad.minIndex)
|
|||
|
|
{
|
|||
|
|
e_DirectionType = E_DirectionType.Right;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
e_DirectionType = E_DirectionType.Left;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (this.index == sectionRoad.maxIndex)
|
|||
|
|
{
|
|||
|
|
e_DirectionType = E_DirectionType.Left;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
e_DirectionType = E_DirectionType.Right;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
Indicator(e_DirectionType, Scenes.Instance.gameScene.flashingLightNumber);
|
|||
|
|
isChangeLanes = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool IsObjectOnLeft(GameObject target, GameObject reference)
|
|||
|
|
{
|
|||
|
|
// <20><>ȡĿ<C8A1><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲο<DAB2><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ò<EFBFBD>
|
|||
|
|
Vector3 directionToTarget = target.transform.position - reference.transform.position;
|
|||
|
|
|
|||
|
|
// <20>ж<EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڲο<DAB2><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// ʹ<>òο<C3B2><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD><EFBFBD><EFBFBD>transform.right<68><74>
|
|||
|
|
float dotProduct = Vector3.Dot(reference.transform.right, directionToTarget);
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾĿ<CABE><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲο<DAB2><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
return dotProduct < 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><>ǰ<EFBFBD><C7B0>ʻ
|
|||
|
|
/// </summary>
|
|||
|
|
private void Forward()
|
|||
|
|
{
|
|||
|
|
if (Vector3.Distance(Scenes.Instance.player.transform.position, this.transform.position) < 150)
|
|||
|
|
{
|
|||
|
|
transform.Translate(transform.forward * Time.deltaTime * 15, Space.World);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20>õ<EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private void AllowRightWay()
|
|||
|
|
{
|
|||
|
|
if (Scenes.Instance.player.isAmbulance && Vector3.Distance(Scenes.Instance.player.transform.position, this.transform.position) < 150)
|
|||
|
|
{
|
|||
|
|
if (indicatorCoroutine != null)
|
|||
|
|
{
|
|||
|
|
StopCoroutine(indicatorCoroutine);
|
|||
|
|
skinCar.SetAllLight(false);
|
|||
|
|
}
|
|||
|
|
if (this.index == Scenes.Instance.player.moveIndex)
|
|||
|
|
{
|
|||
|
|
if (ProbabilityManager.Instance.GetPercent(50))
|
|||
|
|
{
|
|||
|
|
if (this.index > sectionRoad.minIndex)
|
|||
|
|
{
|
|||
|
|
ChangeLanes(E_DirectionType.Left, 0.2f);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
ChangeLanes(E_DirectionType.Right, 0.2f);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (this.index < sectionRoad.maxIndex)
|
|||
|
|
{
|
|||
|
|
ChangeLanes(E_DirectionType.Right, 0.2f);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
ChangeLanes(E_DirectionType.Left, 0.2f);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void ShootFly(Transform transform)
|
|||
|
|
{
|
|||
|
|
if (isDie) return;
|
|||
|
|
rb.useGravity = true;
|
|||
|
|
rb.isKinematic = false;
|
|||
|
|
rb.AddForce((transform.position - this.transform.position).normalized * -100, ForceMode.Impulse);
|
|||
|
|
rb.AddForce(Vector3.up * 20, ForceMode.Impulse);
|
|||
|
|
rb.AddTorque(new Vector3(Random.Range(-180, 180), Random.Range(-180, 180), Random.Range(-180, 180)), ForceMode.Impulse);
|
|||
|
|
isDie = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void ISChangeLanes()
|
|||
|
|
{
|
|||
|
|
this.isChangeLanes = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public void SetRightLeft(E_DirectionType e_DirectionType)
|
|||
|
|
{
|
|||
|
|
this.isChangeLanes = true;
|
|||
|
|
this.e_DirectionType = e_DirectionType;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ת<><D7AA><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
private void Indicator(E_DirectionType e_DirectionType, float number)
|
|||
|
|
{
|
|||
|
|
indicatorCoroutine = StartCoroutine(IE_Indicator(e_DirectionType, number));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// ת<><D7AA><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
|||
|
|
/// </summary>
|
|||
|
|
protected IEnumerator IE_Indicator(E_DirectionType e_DirectionType, float number)
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < Mathf.RoundToInt(number); i++)
|
|||
|
|
{
|
|||
|
|
switch (e_DirectionType)
|
|||
|
|
{
|
|||
|
|
case E_DirectionType.Left:
|
|||
|
|
skinCar.leftQueenIndicator.gameObject.SetActive(true);
|
|||
|
|
yield return new WaitForSeconds(0.1f);
|
|||
|
|
skinCar.leftQueenIndicator.gameObject.SetActive(false);
|
|||
|
|
yield return new WaitForSeconds(0.1f);
|
|||
|
|
break;
|
|||
|
|
case E_DirectionType.Right:
|
|||
|
|
skinCar.rightQueenIndicator.gameObject.SetActive(true);
|
|||
|
|
yield return new WaitForSeconds(0.1f);
|
|||
|
|
skinCar.rightQueenIndicator.gameObject.SetActive(false);
|
|||
|
|
yield return new WaitForSeconds(0.1f);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
yield return null;
|
|||
|
|
}
|
|||
|
|
ChangeLanes(e_DirectionType, Scenes.Instance.gameScene.npcLaneChangeSpeed);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// <20><><EFBFBD><EFBFBD>
|
|||
|
|
/// </summary>
|
|||
|
|
public override void ChangeLanes(E_DirectionType e_DirectionType, float speed)
|
|||
|
|
{
|
|||
|
|
float recordLaneChangeDistance = 0;
|
|||
|
|
float yaw = 0;//<2F><>ͷ
|
|||
|
|
switch (e_DirectionType)
|
|||
|
|
{
|
|||
|
|
case E_DirectionType.Left:
|
|||
|
|
index--;
|
|||
|
|
recordLaneChangeDistance = -laneChangeDistance;
|
|||
|
|
yaw = -20;
|
|||
|
|
break;
|
|||
|
|
case E_DirectionType.Right:
|
|||
|
|
index++;
|
|||
|
|
recordLaneChangeDistance = laneChangeDistance;
|
|||
|
|
yaw = 20;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
this.transform.DOKill();
|
|||
|
|
if (this.transform.parent == null)
|
|||
|
|
{
|
|||
|
|
this.transform.DOMoveZ(this.transform.position.z - recordLaneChangeDistance, speed);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
this.transform.DOLocalMoveX(this.transform.localPosition.x + recordLaneChangeDistance, speed);
|
|||
|
|
}
|
|||
|
|
carNode.transform.DOLocalRotate(new Vector3(0, yaw, 0), speed).OnComplete(() =>
|
|||
|
|
{
|
|||
|
|
carNode.transform.DOLocalRotate(new Vector3(0, 0, 0), speed);
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
}
|