add:添加服务器脚本
This commit is contained in:
@ -11,21 +11,21 @@ using Valheim;
|
||||
|
||||
public class AIController : MonoBehaviour
|
||||
{
|
||||
public AudioClip introAudio;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
public AudioClip introAudio;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
public string waveAnimationTrigger = "Wave";//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
public string leaveAnimationTrigger = "Leave";//<2F>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
public string waveAnimationTrigger = "Wave";//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
public string leaveAnimationTrigger = "Leave";//<2F>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
//<2F><>ת<EFBFBD><D7AA><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>
|
||||
public float rotationDuration = 1.5f;//<2F><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
public float spawnDistance = 2f;//<2F><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>
|
||||
public float rotationSmoothness = 5f;//<2F><>תƽ<D7AA><C6BD><EFBFBD><EFBFBD>
|
||||
//<2F><>ת<EFBFBD><D7AA><EFBFBD>ɲ<EFBFBD><C9B2><EFBFBD>
|
||||
public float rotationDuration = 1.5f;//<2F><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
public float spawnDistance = 2f;//<2F><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD>
|
||||
public float rotationSmoothness = 5f;//<2F><>תƽ<D7AA><C6BD><EFBFBD><EFBFBD>
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||
public float charDisplayDelay = 0.5f;//ÿ<><C3BF><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
|
||||
public float charDisplayDelay = 0.5f;//ÿ<><C3BF><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
public event Action OnIntroductionComplete;
|
||||
|
||||
private AudioSource audioSource;
|
||||
@ -34,17 +34,17 @@ public class AIController : MonoBehaviour
|
||||
private Transform playerTransform;
|
||||
private Coroutine introductionCoroutine;
|
||||
private Coroutine textDisplayCoroutine;
|
||||
private bool hasIntroductionCompleted = false;//<2F><><EFBFBD>ӱ<EFBFBD>־λ
|
||||
private bool isDuringIntroduction = false;//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD>
|
||||
private bool hasIntroductionCompleted = false;//<2F><><EFBFBD>ӱ<EFBFBD>־λ
|
||||
private bool isDuringIntroduction = false;//<2F><><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ڼ<EFBFBD>
|
||||
|
||||
|
||||
//<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
public TMP_Text speedTxt;
|
||||
private const float TxtSpeed = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʱ<CABE><CAB1>
|
||||
public Image dialogBoxImage;//<2F>Ի<EFBFBD><D4BB><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
private const float TxtSpeed = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾʱ<CABE><CAB1>
|
||||
public Image dialogBoxImage;//<2F>Ի<EFBFBD><D4BB><EFBFBD>ͼ<EFBFBD><CDBC>
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
|
||||
private Quaternion specialRotationOffset;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫת
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD>Ƕ<EFBFBD>
|
||||
private Quaternion specialRotationOffset;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫת
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
@ -54,7 +54,7 @@ public class AIController : MonoBehaviour
|
||||
audioSource = gameObject.AddComponent<AudioSource>();
|
||||
}
|
||||
animator = GetComponent<Animator>();
|
||||
//<2F>ģ<DEB8><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
//<2F>ģ<DEB8><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
specialRotationOffset = Quaternion.Euler(0, 90, 0);
|
||||
}
|
||||
|
||||
@ -62,12 +62,12 @@ public class AIController : MonoBehaviour
|
||||
{
|
||||
FindPlayer();
|
||||
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
if (speedTxt != null)
|
||||
{
|
||||
speedTxt.gameObject.SetActive(false);
|
||||
}
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD>ضԻ<D8B6><D4BB><EFBFBD>
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD>ضԻ<D8B6><D4BB><EFBFBD>
|
||||
if (dialogBoxImage != null)
|
||||
{
|
||||
dialogBoxImage.gameObject.SetActive(false);
|
||||
@ -77,43 +77,43 @@ public class AIController : MonoBehaviour
|
||||
|
||||
private void Update()
|
||||
{
|
||||
//<2F>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ڼ<EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ڼ<EFBFBD>ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (isDuringIntroduction && playerTransform != null)
|
||||
{
|
||||
FacePlayerWithOffset();
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>Player
|
||||
//<2F><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>Player
|
||||
private void FindPlayer()
|
||||
{
|
||||
//ͨ<><CDA8>GameManager<65><72>ȡPlayer
|
||||
//ͨ<><CDA8>GameManager<65><72>ȡPlayer
|
||||
if (GameManager.Ins != null && GameManager.Ins.player != null)
|
||||
{
|
||||
playerTransform = GameManager.Ins.player.transform;
|
||||
Debug.Log("<22><>GameManager<65><72><EFBFBD>ҵ<EFBFBD>Player");
|
||||
Debug.Log("<22><>GameManager<65><72><EFBFBD>ҵ<EFBFBD>Player");
|
||||
return;
|
||||
}
|
||||
|
||||
//ͨ<><CDA8><EFBFBD><EFBFBD>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>Player
|
||||
//ͨ<><CDA8><EFBFBD><EFBFBD>ǩ<EFBFBD><C7A9><EFBFBD><EFBFBD>Player
|
||||
GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
|
||||
if (playerObj != null)
|
||||
{
|
||||
playerTransform = playerObj.transform;
|
||||
Debug.Log("<22>ҵ<EFBFBD>Player<65><72>ǩ");
|
||||
Debug.Log("<22>ҵ<EFBFBD>Player<65><72>ǩ");
|
||||
return;
|
||||
}
|
||||
|
||||
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>Player<65><72><EFBFBD><EFBFBD>
|
||||
//ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD>Player<65><72><EFBFBD>
|
||||
Player playerController = FindObjectOfType<Player>();
|
||||
if (playerController != null)
|
||||
{
|
||||
playerTransform = playerController.transform;
|
||||
Debug.Log("<22>ҵ<EFBFBD>player<65><72><EFBFBD><EFBFBD>");
|
||||
Debug.Log("<22>ҵ<EFBFBD>player<65><72><EFBFBD>");
|
||||
return;
|
||||
}
|
||||
|
||||
Debug.LogError("Playerû<72><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
Debug.LogError("Playerû<72><C3BB><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
StartCoroutine(RetryFindPlayer());
|
||||
}
|
||||
|
||||
@ -126,169 +126,169 @@ public class AIController : MonoBehaviour
|
||||
{
|
||||
if (isIntroductionStarted) return;
|
||||
|
||||
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Player<65><72><EFBFBD><EFBFBD>
|
||||
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Player<65><72><EFBFBD><EFBFBD>
|
||||
if(playerTransform == null)
|
||||
{
|
||||
FindPlayer();
|
||||
if (playerTransform == null)
|
||||
{
|
||||
Debug.LogError("<22><><EFBFBD>ܿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>Ҳο<EFBFBD><EFBFBD>ǿյ<EFBFBD>");
|
||||
Debug.LogError("<22><><EFBFBD>ܿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>Ҳο<D2B2><CEBF>ǿյ<C7BF>");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
isIntroductionStarted = true;
|
||||
Debug.Log("AI<41><49><EFBFBD>ܿ<EFBFBD>ʼ");
|
||||
Debug.Log("AI<41><49><EFBFBD>ܿ<EFBFBD>ʼ");
|
||||
|
||||
|
||||
//ֹͣ<CDA3>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>е<EFBFBD>Э<EFBFBD><D0AD>
|
||||
//ֹͣ<CDA3>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>е<EFBFBD>Э<EFBFBD><D0AD>
|
||||
if (introductionCoroutine != null)
|
||||
{
|
||||
StopCoroutine(introductionCoroutine);
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
||||
introductionCoroutine = StartCoroutine(IntroductionRoutine());
|
||||
}
|
||||
|
||||
private IEnumerator IntroductionRoutine()
|
||||
{
|
||||
Debug.Log("<22><>ʼ<EFBFBD><CABC><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD>");
|
||||
Debug.Log("<22><>ʼ<EFBFBD><CABC><EFBFBD>ܿ<EFBFBD><DCBF><EFBFBD><EFBFBD><EFBFBD>");
|
||||
isDuringIntroduction = true;
|
||||
|
||||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
FacePlayerWithOffset();
|
||||
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת
|
||||
if (playerTransform != null)
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵķ<EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵķ<D2B5><C4B7><EFBFBD>
|
||||
Vector3 directionToPlayer = playerTransform.position - transform.position;
|
||||
directionToPlayer.y = 0;//<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
directionToPlayer.y = 0;//<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
if (directionToPlayer != Vector3.zero)
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Quaternion lookAtPlayer = Quaternion.LookRotation(directionToPlayer);
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
Quaternion targetRotation = lookAtPlayer * specialRotationOffset;
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF><EFBFBD>Ƕ<EFBFBD>
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF>Ƕ<EFBFBD>
|
||||
yield return StartCoroutine(SmoothRotate(targetRotation, rotationDuration));
|
||||
}
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD>Ŵ<EFBFBD><C5B4>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD>Ŵ<EFBFBD><C5B4>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (animator != null && !string.IsNullOrEmpty(waveAnimationTrigger))
|
||||
{
|
||||
|
||||
animator.SetTrigger(waveAnimationTrigger);
|
||||
Debug.Log("<22><><EFBFBD>Ŵ<EFBFBD><C5B4>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>");
|
||||
Debug.Log("<22><><EFBFBD>Ŵ<EFBFBD><C5B4>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>");
|
||||
|
||||
//ͬʱ<CDAC><CAB1><EFBFBD>ſ<EFBFBD><C5BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
//ͬʱ<CDAC><CAB1><EFBFBD>ſ<EFBFBD><C5BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ
|
||||
if (introAudio != null)
|
||||
{
|
||||
//ֻ<>ڴ<EFBFBD><DAB4>к<EFBFBD><D0BA><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD>
|
||||
//ֻ<>ڴ<EFBFBD><DAB4>к<EFBFBD><D0BA><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD>
|
||||
if (speedTxt != null)
|
||||
{
|
||||
speedTxt.gameObject.SetActive(true);
|
||||
string fullText = "<22><>ӭ<EFBFBD><D3AD><EFBFBD><EFBFBD>ħ<EFBFBD><C4A7><EFBFBD>ӳ<EFBFBD><D3B3>Ļó<C4BB><C3B3><EFBFBD><EFBFBD>磬<EFBFBD>ռ<EFBFBD>վ<EFBFBD><D5BE>ӿ<EFBFBD><D3BF><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD>ó<EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD>ѡ<EFA3AC><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ʵ<EFBFBD><CAB5>ǿ<EFBFBD><C7BF><EFBFBD>Ļó<EFBFBD>һ<EFBFBD><EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵİ<EFBFBD>ȫ<EFBFBD>Ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||||
string fullText = "<22><>ӭ<EFBFBD><D3AD><EFBFBD><EFBFBD>ħ<EFBFBD><C4A7><EFBFBD>ӳ<EFBFBD><D3B3>Ļó<C4BB><C3B3><EFBFBD><EFBFBD>磬<EFBFBD>ռ<EFBFBD>վ<EFBFBD><D5BE>ӿ<EFBFBD><D3BF><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFA3AC><EFBFBD><EFBFBD>Ҫ<EFBFBD>ó<EFBFBD>Э<EFBFBD><D0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9><EFBFBD>ѡ<EFA3AC><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD>ʵ<EFBFBD><CAB5>ǿ<EFBFBD><C7BF>Ļó<C4BB>һ<EFBFBD><D2BB>ս<EFBFBD><D5BD><EFBFBD>ɣ<EFBFBD><C9A3><EFBFBD><EFBFBD>ǵİ<C7B5>ȫ<EFBFBD>Ͱ<EFBFBD><CDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>";
|
||||
textDisplayCoroutine = StartCoroutine(DisplayTextCharByChar(fullText));
|
||||
|
||||
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ֿ<EFBFBD>ʼ<EFBFBD><CABC>ʾ<EFBFBD><CABE><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ֿ<EFBFBD>ʼ<EFBFBD><CABC>ʾ<EFBFBD><CABE><EFBFBD>ٲ<EFBFBD><D9B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
yield return new WaitForSeconds(0.5f);
|
||||
}
|
||||
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>" + introAudio.name);
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ţ<EFBFBD>" + introAudio.name);
|
||||
audioSource.clip = introAudio;
|
||||
audioSource.Play();
|
||||
|
||||
//<2F>ȴ<EFBFBD><C8B4><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ǰ2<C7B0><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
//<2F>ȴ<EFBFBD><C8B4><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ǰ2<C7B0><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
float audioLength = introAudio.length;
|
||||
yield return new WaitForSeconds(audioLength - 2f);//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
||||
yield return new WaitForSeconds(audioLength - 2f);//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>
|
||||
|
||||
//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
//<2F><>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><CFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
if (speedTxt != null)
|
||||
{
|
||||
HideTxt();
|
||||
}
|
||||
|
||||
//<2F>ȴ<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>2<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
|
||||
//<2F>ȴ<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
|
||||
yield return new WaitForSeconds(2f);
|
||||
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD>");
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>");
|
||||
}
|
||||
else
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>12<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
yield return new WaitForSeconds(10f);//<2F><><EFBFBD>ٵȴ<D9B5>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>Ƶ
|
||||
//<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>ȴ<EFBFBD>12<31><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
yield return new WaitForSeconds(10f);//<2F><><EFBFBD>ٵȴ<D9B5>ʱ<EFBFBD>䣬<EFBFBD><E4A3AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>Ƶ
|
||||
|
||||
if (speedTxt != null)
|
||||
{
|
||||
HideTxt();
|
||||
}
|
||||
|
||||
yield return new WaitForSeconds(2f);//<2F>ٵȴ<D9B5><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
yield return new WaitForSeconds(2f);//<2F>ٵȴ<D9B5><C8B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("AI<41><49><EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>Ƶ");
|
||||
Debug.LogError("AI<41><49><EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD>Ƶ");
|
||||
yield return new WaitForSeconds(3f);
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>ֹͣʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD><EFBFBD><EFBFBD>ֹͣʵʱ<CAB5><CAB1><EFBFBD><EFBFBD>
|
||||
isDuringIntroduction = false;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD>
|
||||
if (animator != null && !string.IsNullOrEmpty(leaveAnimationTrigger))
|
||||
{
|
||||
//<2F>ȴ<EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>ȴ<EFBFBD>һ<EFBFBD><D2BB>ʱ<EFBFBD><CAB1><EFBFBD><F3B2A5B7>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD>
|
||||
yield return new WaitForSeconds(2f);
|
||||
//<2F><>ת180<38><30>
|
||||
//<2F><>ת180<38><30>
|
||||
Quaternion targetRotation = transform.rotation * Quaternion.Euler(0, 180, 0);
|
||||
yield return StartCoroutine(SmoothRotate(targetRotation, rotationDuration));
|
||||
|
||||
animator.SetTrigger(leaveAnimationTrigger);
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD>");
|
||||
Debug.Log("<22><><EFBFBD><EFBFBD><EFBFBD>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD>");
|
||||
|
||||
//<2F>ȴ<EFBFBD><C8B4>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>ȴ<EFBFBD><C8B4>뿪<EFBFBD><EBBFAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
yield return new WaitForSeconds(2f);
|
||||
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
|
||||
hasIntroductionCompleted = true;
|
||||
OnIntroductionComplete?.Invoke();
|
||||
Debug.Log("AI<41><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>뿪");
|
||||
Debug.Log("AI<41><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><D7BC><EFBFBD>뿪");
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD>AI<41><49>ɫ
|
||||
//<2F><><EFBFBD><EFBFBD>AI<41><49>ɫ
|
||||
gameObject.SetActive(false);
|
||||
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>Э<EFBFBD><D0AD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>Э<EFBFBD><D0AD>
|
||||
private IEnumerator DisplayTextCharByChar(string fullText)
|
||||
{
|
||||
if (speedTxt == null) yield break;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EEB2A2>ʾ<EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EEB2A2>ʾ<EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>
|
||||
if (dialogBoxImage != null)
|
||||
{
|
||||
dialogBoxImage.gameObject.SetActive(true);
|
||||
//<2F><><EFBFBD>öԻ<C3B6><D4BB><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
|
||||
//<2F><><EFBFBD>öԻ<C3B6><D4BB><EFBFBD><EFBFBD>ʼ<CABC><CDB8><EFBFBD><EFBFBD>Ϊ0
|
||||
dialogBoxImage.color = new Color(dialogBoxImage.color.r, dialogBoxImage.color.g, dialogBoxImage.color.b, 0f);
|
||||
//<2F>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>Ի<EFBFBD><D4BB><EFBFBD><EFBFBD><EFBFBD>
|
||||
dialogBoxImage.DOFade(1f, TxtSpeed).SetEase(Ease.Linear);
|
||||
}
|
||||
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ȫ<C8AB><CDB8><EFBFBD><EFBFBD>
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ȫ<C8AB><CDB8><EFBFBD><EFBFBD>
|
||||
speedTxt.color = new Color(speedTxt.color.r, speedTxt.color.g, speedTxt.color.b, 0f);
|
||||
|
||||
//<2F>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F>Ƚ<EFBFBD><C8BD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
speedTxt.DOFade(1f, TxtSpeed).SetEase(Ease.Linear);
|
||||
yield return new WaitForSeconds(TxtSpeed);
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD>
|
||||
speedTxt.text = "";//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>ı<EFBFBD>
|
||||
speedTxt.text = "";//<2F><><EFBFBD><EFBFBD>ı<EFBFBD>
|
||||
|
||||
for(int i = 0; i < fullText.Length; i++)
|
||||
{
|
||||
@ -297,26 +297,26 @@ public class AIController : MonoBehaviour
|
||||
}
|
||||
}
|
||||
|
||||
//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//ʵʱ<CAB5><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
private void FacePlayerWithOffset()
|
||||
{
|
||||
if (playerTransform == null) return;
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵķ<EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵķ<D2B5><C4B7><EFBFBD>
|
||||
Vector3 directionToPlayer = playerTransform.position - transform.position;
|
||||
directionToPlayer.y = 0;//<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
directionToPlayer.y = 0;//<2F><><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>
|
||||
if (directionToPlayer != Vector3.zero)
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD>ת
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD>ת
|
||||
Quaternion lookRotation = Quaternion.LookRotation(directionToPlayer);
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
//Ӧ<><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>תƫ<D7AA><C6AB>
|
||||
Quaternion targetRotation = lookRotation * specialRotationOffset;
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF><EFBFBD>Ƕ<EFBFBD>
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF>Ƕ<EFBFBD>
|
||||
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * rotationSmoothness);
|
||||
}
|
||||
}
|
||||
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>תЭ<D7AA><D0AD>
|
||||
//ƽ<><C6BD><EFBFBD><EFBFBD>תЭ<D7AA><D0AD>
|
||||
private IEnumerator SmoothRotate(Quaternion targetRotation,float duration)
|
||||
{
|
||||
float elapsedTime = 0f;
|
||||
@ -329,7 +329,7 @@ public class AIController : MonoBehaviour
|
||||
yield return null;
|
||||
}
|
||||
|
||||
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF><EFBFBD>Ƕ<EFBFBD>
|
||||
//ȷ<><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ŀ<EFBFBD><C4BF>Ƕ<EFBFBD>
|
||||
transform.rotation = targetRotation;
|
||||
}
|
||||
|
||||
@ -338,42 +338,42 @@ public class AIController : MonoBehaviour
|
||||
if (speedTxt == null) return;
|
||||
|
||||
speedTxt.text = txt;
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ȫ<C8AB><CDB8><EFBFBD><EFBFBD>
|
||||
//<2F><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD>ȫ<C8AB><CDB8><EFBFBD><EFBFBD>
|
||||
speedTxt.color = new Color(speedTxt.color.r, speedTxt.color.g, speedTxt.color.b, 0f);
|
||||
// ʹ<><CAB9>DoTweenʵ<6E><CAB5><EFBFBD><EFBFBD><EFBFBD>ֵĽ<D6B5><C4BD><EFBFBD>Ч<EFBFBD><D0A7>
|
||||
// ʹ<><CAB9>DoTweenʵ<6E><CAB5><EFBFBD><EFBFBD><EFBFBD>ֵĽ<D6B5><C4BD><EFBFBD>Ч<EFBFBD><D0A7>
|
||||
speedTxt.DOFade(1f, TxtSpeed).SetEase(Ease.Linear).OnComplete(() =>
|
||||
{
|
||||
cb?.Invoke();
|
||||
}); // <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><CDB8><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>Ч<EFBFBD><D0A7>
|
||||
}); // <20><><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><CDB8><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>Ի<EFBFBD><D4BB><EFBFBD>Ч<EFBFBD><D0A7>
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ķ<EFBFBD><C4B7><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ķ<EFBFBD><C4B7><EFBFBD>
|
||||
public void HideTxt(Action cb = null)
|
||||
{
|
||||
if (speedTxt == null) return;
|
||||
|
||||
//ֹͣ<CDA3>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5>ı<EFBFBD><C4B1><EFBFBD>ʾЭ<CABE><D0AD>
|
||||
//ֹͣ<CDA3>κ<EFBFBD><CEBA><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5>ı<EFBFBD><C4B1><EFBFBD>ʾЭ<CABE><D0AD>
|
||||
if (textDisplayCoroutine != null)
|
||||
{
|
||||
StopCoroutine(textDisplayCoroutine);
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ͶԻ<CDB6><D4BB><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1>ͶԻ<CDB6><D4BB><EFBFBD>
|
||||
Sequence hideSequence = DOTween.Sequence();
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (speedTxt != null)
|
||||
{
|
||||
hideSequence.Join(speedTxt.DOFade(0f, TxtSpeed).SetEase(Ease.Linear));
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD>ӶԻ<D3B6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
//<2F><><EFBFBD>ӶԻ<D3B6><D4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (dialogBoxImage != null)
|
||||
{
|
||||
hideSequence.Join(dialogBoxImage.DOFade(0f, TxtSpeed).SetEase(Ease.Linear));
|
||||
}
|
||||
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ûص<EFBFBD>
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><F3B2A2B5>ûص<C3BB>
|
||||
hideSequence.OnComplete(() =>
|
||||
{
|
||||
if (speedTxt != null)
|
||||
@ -390,7 +390,7 @@ public class AIController : MonoBehaviour
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
//<2F><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
||||
//<2F><><EFBFBD><EFBFBD>Э<EFBFBD><D0AD>
|
||||
if (introductionCoroutine != null)
|
||||
{
|
||||
StopCoroutine(introductionCoroutine);
|
||||
@ -401,7 +401,7 @@ public class AIController : MonoBehaviour
|
||||
StopCoroutine(textDisplayCoroutine);
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tween<65><6E><EFBFBD><EFBFBD>
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Tween<65><6E><EFBFBD><EFBFBD>
|
||||
if (speedTxt != null)
|
||||
{
|
||||
speedTxt.DOKill();
|
||||
|
||||
@ -87585,6 +87585,50 @@ MonoBehaviour:
|
||||
RuntimeFollower: {fileID: 0}
|
||||
colliderMaxDistance: 100
|
||||
lastTimeMaxDistanceCalced: 638810189389026509
|
||||
--- !u!1 &882540216
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 882540217}
|
||||
- component: {fileID: 882540218}
|
||||
m_Layer: 0
|
||||
m_Name: HttpServer
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &882540217
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 882540216}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 5.461615, y: 1.6143467, z: 7.726717}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!114 &882540218
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 882540216}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 61fbd59abecedaa41b1a41080bb5716b, type: 3}
|
||||
m_Name:
|
||||
m_EditorClassIdentifier:
|
||||
--- !u!1001 &884255792
|
||||
PrefabInstance:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -130359,6 +130403,7 @@ MonoBehaviour:
|
||||
winLightBgm: {fileID: 1875134527}
|
||||
goEffect: {fileID: 327597843}
|
||||
place: 0
|
||||
gameId: 0
|
||||
--- !u!1 &1289206090
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@ -238383,3 +238428,4 @@ SceneRoots:
|
||||
- {fileID: 697050083}
|
||||
- {fileID: 1675573370}
|
||||
- {fileID: 2076119386}
|
||||
- {fileID: 882540217}
|
||||
|
||||
@ -8,6 +8,22 @@ using UnityEngine.AI;
|
||||
using UnityEngine.XR.Interaction.Toolkit;
|
||||
using Wave.Native;
|
||||
|
||||
public enum GameKey
|
||||
{
|
||||
DinosaurPark2=0,//重返侏罗纪
|
||||
SpongeBob=1,//深海冒险
|
||||
XMen=2,//银河守护者
|
||||
KOF=3,//幻影交锋
|
||||
Valheim=4,//小小幻宠
|
||||
FutureMen=5,//未来战警
|
||||
AliceBall=6,//爱丽丝的舞会
|
||||
Zombie=7,//僵尸来了
|
||||
DefendNJ=8,//保卫金陵
|
||||
Loong=9, //巨龙猎人
|
||||
MRCS=10,//火力对决
|
||||
SXDMystery=11,//三星堆之谜
|
||||
}
|
||||
|
||||
namespace Valheim
|
||||
{
|
||||
public enum Place
|
||||
@ -128,7 +144,7 @@ namespace Valheim
|
||||
[Header("场地")]
|
||||
public Place place = Place.GongSi1Lou;
|
||||
// 版本号
|
||||
|
||||
public GameKey gameId;
|
||||
|
||||
private NavMeshDataInstance currentInstance;
|
||||
public void Close()
|
||||
@ -140,6 +156,7 @@ namespace Valheim
|
||||
void Start()
|
||||
{
|
||||
Ins = this;
|
||||
gameId = GameKey.Valheim;
|
||||
Application.targetFrameRate = 60;
|
||||
//ConPanel.Show();
|
||||
|
||||
|
||||
@ -101,7 +101,9 @@ namespace Valheim
|
||||
[SyncVar]
|
||||
public long vistEnd = 0;
|
||||
// 总游玩时长
|
||||
private int vistAllTime = (int)(60 * 15F);
|
||||
public int vistAllTime = (int)(60 * 15F);
|
||||
|
||||
public float curGameTime = 0;
|
||||
// 游戏是否结束
|
||||
[NonSerialized]
|
||||
[SyncVar]
|
||||
@ -282,6 +284,11 @@ namespace Valheim
|
||||
battleArea.SetActive(false);
|
||||
}
|
||||
|
||||
public int GetNowTime()
|
||||
{
|
||||
return Mathf.RoundToInt(curGameTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建复活点
|
||||
/// </summary>
|
||||
@ -1585,7 +1592,7 @@ namespace Valheim
|
||||
if (GameInit.Ins.place == Place.GongSi1LouShiwai)
|
||||
authInfo.shop = 999;
|
||||
#endif
|
||||
authInfo.gameId = 4;
|
||||
authInfo.gameId = (int)GameInit.Ins.gameId;
|
||||
string authJson = JsonUtility.ToJson(authInfo);
|
||||
Debug.Log("发送数据 -> " + authJson);
|
||||
request.RawData = System.Text.Encoding.UTF8.GetBytes(authJson);
|
||||
@ -1892,6 +1899,11 @@ namespace Valheim
|
||||
}, 75f);
|
||||
|
||||
}
|
||||
|
||||
if (isPlayGame)
|
||||
{
|
||||
curGameTime += Time.deltaTime;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
305
Assets/_Valheim/Scripts/HttpServer.cs
Normal file
305
Assets/_Valheim/Scripts/HttpServer.cs
Normal file
@ -0,0 +1,305 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Collections.Concurrent;
|
||||
using UnityEngine;
|
||||
using Valheim;
|
||||
|
||||
[Serializable]
|
||||
public class IntentMessage
|
||||
{
|
||||
public string intent;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class PlayingStatusResponse
|
||||
{
|
||||
public int code;
|
||||
public ServerData data;
|
||||
public string message;
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class ServerData
|
||||
{
|
||||
public string gameName;
|
||||
public int gameTotalTime;
|
||||
public int currentPlayTime;
|
||||
}
|
||||
|
||||
public class HttpServer : MonoBehaviour
|
||||
{
|
||||
private HttpListener listener;
|
||||
private Thread serverThread;
|
||||
private volatile bool isRunning;
|
||||
|
||||
private const string SERVER_URL = "http://+:12345/";
|
||||
|
||||
// 子线程 → 主线程
|
||||
private static ConcurrentQueue<NetMessage> messageQueue = new ConcurrentQueue<NetMessage>();
|
||||
|
||||
void Awake()
|
||||
{
|
||||
DontDestroyOnLoad(gameObject);
|
||||
}
|
||||
|
||||
void Start()
|
||||
{
|
||||
StartServer();
|
||||
}
|
||||
|
||||
#region HTTP Server
|
||||
|
||||
private void StartServer()
|
||||
{
|
||||
try
|
||||
{
|
||||
listener = new HttpListener();
|
||||
listener.Prefixes.Add(SERVER_URL);
|
||||
listener.Start();
|
||||
|
||||
isRunning = true;
|
||||
serverThread = new Thread(ListenLoop)
|
||||
{
|
||||
IsBackground = true
|
||||
};
|
||||
serverThread.Start();
|
||||
|
||||
Debug.Log($"✅ HTTP Server 启动成功:{SERVER_URL}");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("❌ HTTP Server 启动失败:" + e);
|
||||
}
|
||||
}
|
||||
|
||||
private void ListenLoop()
|
||||
{
|
||||
while (isRunning && listener.IsListening)
|
||||
{
|
||||
try
|
||||
{
|
||||
var context = listener.GetContext();
|
||||
ThreadPool.QueueUserWorkItem(ProcessRequest, context);
|
||||
}
|
||||
catch (HttpListenerException)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessRequest(object state)
|
||||
{
|
||||
var context = (HttpListenerContext)state;
|
||||
var request = context.Request;
|
||||
var response = context.Response;
|
||||
|
||||
response.AddHeader("Access-Control-Allow-Origin", "*");
|
||||
response.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
|
||||
response.AddHeader("Access-Control-Allow-Headers", "Content-Type");
|
||||
response.ContentType = "application/json; charset=utf-8";
|
||||
|
||||
try
|
||||
{
|
||||
if (request.HttpMethod == "POST")
|
||||
{
|
||||
string raw;
|
||||
using (var reader = new StreamReader(
|
||||
request.InputStream,
|
||||
request.ContentEncoding ?? Encoding.UTF8))
|
||||
{
|
||||
raw = reader.ReadToEnd();
|
||||
}
|
||||
|
||||
Debug.Log($"📩 收到原始 JSON:{raw}");
|
||||
|
||||
// 解析 intent
|
||||
IntentMessage intentMsg = null;
|
||||
try
|
||||
{
|
||||
intentMsg = JsonUtility.FromJson<IntentMessage>(raw);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError("JSON 解析失败:" + e);
|
||||
}
|
||||
|
||||
// 只处理 is_playing
|
||||
if (intentMsg != null && intentMsg.intent == "is_playing")
|
||||
{
|
||||
var resp = new PlayingStatusResponse
|
||||
{
|
||||
code = 200,
|
||||
data = new ServerData()
|
||||
{
|
||||
gameName = GetCurrentGameName(),
|
||||
gameTotalTime = GetGameTotalTime(),
|
||||
currentPlayTime = GetCurrentPlayTime()
|
||||
},
|
||||
message = "请求成功"
|
||||
};
|
||||
|
||||
string json = JsonUtility.ToJson(resp);
|
||||
byte[] data = Encoding.UTF8.GetBytes(json);
|
||||
response.OutputStream.Write(data, 0, data.Length);
|
||||
}
|
||||
else
|
||||
{
|
||||
// 未知 intent
|
||||
string err = "{\"code\":400,\"msg\":\"unknown intent\"}";
|
||||
byte[] data = Encoding.UTF8.GetBytes(err);
|
||||
response.OutputStream.Write(data, 0, data.Length);
|
||||
}
|
||||
|
||||
response.Close();
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError(e);
|
||||
WriteResponse(response, 500, "error");
|
||||
}
|
||||
finally
|
||||
{
|
||||
response.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void WriteResponse(HttpListenerResponse response, int code, string msg)
|
||||
{
|
||||
string json = $"{{\"code\":{code},\"msg\":\"{msg}\"}}";
|
||||
byte[] data = Encoding.UTF8.GetBytes(json);
|
||||
response.OutputStream.Write(data, 0, data.Length);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Unity Main Thread
|
||||
|
||||
void Update()
|
||||
{
|
||||
while (messageQueue.TryDequeue(out var msg))
|
||||
{
|
||||
Debug.Log($"📩 来自 [{msg.sender}] 指令 [{msg.command}]");
|
||||
HandleMessage(msg);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Message Logic
|
||||
|
||||
[Serializable]
|
||||
public class NetMessage
|
||||
{
|
||||
public string sender;
|
||||
public string command;
|
||||
}
|
||||
|
||||
private NetMessage ParseMessage(string raw)
|
||||
{
|
||||
if (string.IsNullOrEmpty(raw))
|
||||
return null;
|
||||
|
||||
try
|
||||
{
|
||||
raw = raw.Replace("\"", "").Trim();
|
||||
var parts = raw.Split(':');
|
||||
if (parts.Length != 2)
|
||||
{
|
||||
Debug.LogWarning($"消息格式错误:{raw}");
|
||||
return null;
|
||||
}
|
||||
|
||||
return new NetMessage
|
||||
{
|
||||
sender = parts[0].Trim(),
|
||||
command = parts[1].Trim()
|
||||
};
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.LogError($"解析失败:{raw}\n{e}");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleMessage(NetMessage msg)
|
||||
{
|
||||
switch (msg.command)
|
||||
{
|
||||
case "isStart":
|
||||
OnStartCommand(msg.sender);
|
||||
break;
|
||||
|
||||
default:
|
||||
Debug.LogWarning($"未知指令:{msg.command}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void OnStartCommand(string sender)
|
||||
{
|
||||
Debug.Log($"🚀 Start 指令来自:{sender}");
|
||||
|
||||
// ✅ 在这里安全调用 Unity API
|
||||
// GameManager.Ins.QuitGame();
|
||||
}
|
||||
|
||||
|
||||
private string GetCurrentGameName()
|
||||
{
|
||||
return GameInit.Ins.gameId.ToString(); // 或你自己的 GameManager
|
||||
}
|
||||
|
||||
private int GetGameTotalTime()
|
||||
{
|
||||
return Mathf.FloorToInt(GameManager.Ins.vistAllTime); // 举例:1 小时(秒)
|
||||
}
|
||||
|
||||
private int GetCurrentPlayTime()
|
||||
{
|
||||
return GameManager.Ins.GetNowTime();
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Shutdown
|
||||
|
||||
void OnDestroy()
|
||||
{
|
||||
StopServer();
|
||||
}
|
||||
|
||||
private void StopServer()
|
||||
{
|
||||
isRunning = false;
|
||||
|
||||
try
|
||||
{
|
||||
listener?.Stop();
|
||||
listener?.Close();
|
||||
}
|
||||
catch { }
|
||||
|
||||
try
|
||||
{
|
||||
if (serverThread != null && serverThread.IsAlive)
|
||||
serverThread.Join(300);
|
||||
}
|
||||
catch { }
|
||||
|
||||
Debug.Log("🛑 HTTP Server 已关闭");
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
11
Assets/_Valheim/Scripts/HttpServer.cs.meta
Normal file
11
Assets/_Valheim/Scripts/HttpServer.cs.meta
Normal file
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 61fbd59abecedaa41b1a41080bb5716b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@ -5,7 +5,7 @@ EditorBuildSettings:
|
||||
m_ObjectHideFlags: 0
|
||||
serializedVersion: 2
|
||||
m_Scenes:
|
||||
- enabled: 0
|
||||
- enabled: 1
|
||||
path: Assets/_Valheim/Scenes/NanJing_GongSi1Lou.unity
|
||||
guid: dab1cc15df348a84f8a2662c2b6311b2
|
||||
- enabled: 0
|
||||
@ -206,7 +206,7 @@ EditorBuildSettings:
|
||||
- enabled: 0
|
||||
path: Assets/_Valheim/Scenes/Zhejiang_Wenzhou_Cangnan_Yintaicheng.unity
|
||||
guid: 50e97a3b81e124e46ba4e1ca28ad2b12
|
||||
- enabled: 1
|
||||
- enabled: 0
|
||||
path: Assets/_Valheim/Scenes/Shandong_Weifang_Linqu_WandaGuangchang.unity
|
||||
guid: 274c5f91b7b14024cbd7095fa5d79ef9
|
||||
- enabled: 0
|
||||
|
||||
@ -162,7 +162,7 @@ PlayerSettings:
|
||||
androidSupportedAspectRatio: 1
|
||||
androidMaxAspectRatio: 2.1
|
||||
applicationIdentifier:
|
||||
Android: com.pineappletech.valheim.shandongweifanglinquwandaguangchang
|
||||
Android: com.pineappletech.valheim.gongsi1lou
|
||||
buildNumber:
|
||||
Standalone: 0
|
||||
VisionOS: 0
|
||||
|
||||
Reference in New Issue
Block a user