「Unity/3d/向き」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==ターゲットの向きを向く== enemyObj.transform.LookAt(playerObj.transform);」) |
(→アバターにつけた名前をカメラに向ける) |
||
| (同じ利用者による、間の4版が非表示) | |||
| 行1: | 行1: | ||
==ターゲットの向きを向く== | ==ターゲットの向きを向く== | ||
enemyObj.transform.LookAt(playerObj.transform); | enemyObj.transform.LookAt(playerObj.transform); | ||
| + | |||
| + | ==こちらを向かせる== | ||
| + | 注意:負荷が高いかもなので、近くのオブジェクトだけとかの対応が必要かも。 | ||
| + | |||
| + | 全体処理を行うLookAtScene.cs | ||
| + | <pre> | ||
| + | public class LookAtScene : MonoBehaviour | ||
| + | { | ||
| + | [SerializeField] GameObject charaCubePrefab; | ||
| + | [SerializeField] GameObject player; | ||
| + | void Start() | ||
| + | { | ||
| + | for (int i = 0; i < 10; i++) | ||
| + | { | ||
| + | GameObject charaCube = Instantiate(charaCubePrefab); | ||
| + | charaCube.transform.localPosition = new Vector3(1f * i - 2.5f, Random.RandomRange(-5f, 5f), Random.RandomRange(-1f, 1f)); | ||
| + | charaCube.GetComponent<CharaCubeController>().player = player; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
| + | CharaCubeのPrefabにつけたCharaCubeController.cs | ||
| + | <pre> | ||
| + | public class CharaCubeController : MonoBehaviour | ||
| + | { | ||
| + | public GameObject player; | ||
| + | |||
| + | void Update() | ||
| + | { | ||
| + | var dir = transform.position - player.transform.position; | ||
| + | var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up); | ||
| + | var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward); | ||
| + | transform.rotation = lookAtRotation * offsetRotation; | ||
| + | } | ||
| + | } | ||
| + | </pre> | ||
| + | 参考:https://nekojara.city/unity-look-at | ||
| + | |||
| + | ==アバターにつけた名前をカメラに向ける== | ||
| + | <pre> | ||
| + | var dir = userNameText.transform.position - Camera.main.transform.position; | ||
| + | var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up); | ||
| + | var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward); | ||
| + | userNameText.transform.rotation = lookAtRotation * offsetRotation; | ||
| + | </pre> | ||
| + | |||
| + | ==相手にこちらを向かせる== | ||
| + | <pre> | ||
| + | // 操作キャラへ向ける(高さ軸方向の向きは無視) | ||
| + | float beforeRotationX = enemy.transform.localEulerAngles.x; | ||
| + | var dir = playerAvater.transform.position - enemyAvater.transform.position; | ||
| + | var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up); | ||
| + | var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward); | ||
| + | enemyAvater.transform.rotation = lookAtRotation * offsetRotation; | ||
| + | enemyAvater.transform.rotation = Quaternion.Euler(beforeRotationX, transform.localEulerAngles.y, enemyAvater.transform.localEulerAngles.z); | ||
| + | </pre> | ||
2023年4月18日 (火) 02:52時点における最新版
ターゲットの向きを向く
enemyObj.transform.LookAt(playerObj.transform);
こちらを向かせる
注意:負荷が高いかもなので、近くのオブジェクトだけとかの対応が必要かも。
全体処理を行うLookAtScene.cs
public class LookAtScene : MonoBehaviour
{
[SerializeField] GameObject charaCubePrefab;
[SerializeField] GameObject player;
void Start()
{
for (int i = 0; i < 10; i++)
{
GameObject charaCube = Instantiate(charaCubePrefab);
charaCube.transform.localPosition = new Vector3(1f * i - 2.5f, Random.RandomRange(-5f, 5f), Random.RandomRange(-1f, 1f));
charaCube.GetComponent<CharaCubeController>().player = player;
}
}
}
CharaCubeのPrefabにつけたCharaCubeController.cs
public class CharaCubeController : MonoBehaviour
{
public GameObject player;
void Update()
{
var dir = transform.position - player.transform.position;
var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up);
var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward);
transform.rotation = lookAtRotation * offsetRotation;
}
}
参考:https://nekojara.city/unity-look-at
アバターにつけた名前をカメラに向ける
var dir = userNameText.transform.position - Camera.main.transform.position; var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up); var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward); userNameText.transform.rotation = lookAtRotation * offsetRotation;
相手にこちらを向かせる
// 操作キャラへ向ける(高さ軸方向の向きは無視) float beforeRotationX = enemy.transform.localEulerAngles.x; var dir = playerAvater.transform.position - enemyAvater.transform.position; var lookAtRotation = Quaternion.LookRotation(dir, Vector3.up); var offsetRotation = Quaternion.FromToRotation(Vector3.forward, Vector3.forward); enemyAvater.transform.rotation = lookAtRotation * offsetRotation; enemyAvater.transform.rotation = Quaternion.Euler(beforeRotationX, transform.localEulerAngles.y, enemyAvater.transform.localEulerAngles.z);
