mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-05-14 22:50:08 -05:00
Unity 2023.1以降のバージョンでUnityEngine.Object.FindObjectsOfType系APIがObsoleteになり、次の警告が発生していました。 ``` Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs(250,24): warning CS0618: 'Object.FindObjectOfType<T>()' is obsolete: 'Object.FindObjectOfType has been deprecated. Use Object.FindFirstObjectByType instead or if finding any instance is acceptable the faster Object.FindAnyObjectByType' Assets/VRM10_Samples/VRM10Viewer/VRM10ViewerUI.cs(208,31): warning CS0618: 'Object.FindObjectsOfType<T>()' is obsolete: 'Object.FindObjectsOfType has been deprecated. Use Object.FindObjectsByType instead which lets you decide whether you need the results sorted or not. FindObjectsOfType sorts the results by InstanceID but if you do not need this using FindObjectSortMode.None is considerably faster.' ``` 代わりにFindObjectsBy系APIを使うようにしました。これはUnity 2021.3にも存在しているので、そのまま使うことができました。 FindObjectOfType()とFindFirstObjectByType()の違いに関してはドキュメントからは読み取れませんでしたが、 Unity-Technologiesgが公開しているUnity 6000のソースコードを見る限り、動作は同一に見えるためそのまま置き換えました。 https://github.com/Unity-Technologies/UnityCsReference/blob/6000.0/Runtime/Export/Scripting/UnityEngineObject.bindings.cs#L586-L602
79 lines
2.1 KiB
C#
79 lines
2.1 KiB
C#
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace VRM
|
|
{
|
|
public class LookAtTargetSwitcher : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
List<Transform> m_targets = new List<Transform>();
|
|
|
|
[SerializeField, Range(0, 90.0f)]
|
|
float m_thresholdDegrees = 60.0f;
|
|
|
|
[SerializeField]
|
|
VRMLookAtHead m_lookAtHead;
|
|
|
|
[SerializeField]
|
|
Blinker m_blinker;
|
|
|
|
private void Reset()
|
|
{
|
|
m_lookAtHead = GameObject.FindFirstObjectByType<VRMLookAtHead>();
|
|
m_blinker = GameObject.FindFirstObjectByType<Blinker>();
|
|
}
|
|
|
|
float CalcScore(Transform target)
|
|
{
|
|
return Vector3.Dot(m_lookAtHead.Head.forward, target.position - m_lookAtHead.Head.position);
|
|
}
|
|
|
|
Transform ChooseTarget()
|
|
{
|
|
Transform target = null;
|
|
float maxScore = 0;
|
|
var min = System.Math.Cos(m_thresholdDegrees * Mathf.Deg2Rad);
|
|
foreach (var x in m_targets)
|
|
{
|
|
var score = CalcScore(x);
|
|
if (score > min && score > maxScore)
|
|
{
|
|
maxScore = score;
|
|
target = x;
|
|
}
|
|
}
|
|
return target;
|
|
}
|
|
|
|
Transform m_lastTarget;
|
|
|
|
private void Update()
|
|
{
|
|
if (m_targets == null || m_targets.Count == 0) return;
|
|
|
|
var target = ChooseTarget();
|
|
if (target != m_lastTarget)
|
|
{
|
|
// blink
|
|
//Debug.Log("request");
|
|
m_lastTarget = target;
|
|
m_blinker.Request = true;
|
|
}
|
|
|
|
Vector3 targetPosition;
|
|
if (target == null)
|
|
{
|
|
// forward
|
|
targetPosition = m_lookAtHead.Head.position + m_lookAtHead.Head.forward * 20.0f;
|
|
}
|
|
else
|
|
{
|
|
targetPosition = target.position;
|
|
}
|
|
// half move
|
|
transform.position += (targetPosition - transform.position) * 0.5f;
|
|
}
|
|
}
|
|
}
|