Пишу ИИ врага (слайма) и появился вопрос.
Мне нужно, чтобы при приближении слайм начал смотреть в сторону персонажа.
Сделать это вроде как легко, transform.LookAt(player);
Но тут есть проблема - мне нужно чтобы поворачивалась только ось Y (т.е. направо-налево)
Лазил по форумах, но нигде не сказано про эту проблему. В свойствах rigidbody заморозка других осей не помогла.
Что делать?
Код:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AIScript : MonoBehaviour {
public Transform player;
public float distance;
public int damage;
public float speed;
private Rigidbody rb;
public void Start() {
rb = transform.GetComponent<Rigidbody> ();
}
void AI_Jump(float JumpPower, float DirectionPower) {
Vector3 temp = new Vector3 (DirectionPower, JumpPower, 0);
rb.velocity = transform.forward + temp;
}
bool IntersectFloor() {
return (Physics.Raycast (transform.position, Vector3.down, 2f));
}
private float timer_jump = 0f;
void AI_JumpTime() {
timer_jump += Time.deltaTime * 1f;
if (timer_jump >= speed && IntersectFloor()) {
AI_Jump (10f, 3f);
if(!AI_PlayerDetected(player, distance))
transform.Rotate (new Vector3 (0, Random.Range (0, 360), 0));
timer_jump = 0f;
}
}
bool AI_PlayerDetected(Transform player, float minDistance) {
return (Vector3.Distance (player.position, transform.position) < minDistance);
}
void AI_MoveToPlayer() {
if (AI_PlayerDetected (player, distance)) {
transform.LookAt (player);
}
}
public void Update() {
AI_JumpTime ();
AI_MoveToPlayer ();
}
}
using System.Collections.Generic;
using UnityEngine;
public class AIScript : MonoBehaviour {
public Transform player;
public float distance;
public int damage;
public float speed;
private Rigidbody rb;
public void Start() {
rb = transform.GetComponent<Rigidbody> ();
}
void AI_Jump(float JumpPower, float DirectionPower) {
Vector3 temp = new Vector3 (DirectionPower, JumpPower, 0);
rb.velocity = transform.forward + temp;
}
bool IntersectFloor() {
return (Physics.Raycast (transform.position, Vector3.down, 2f));
}
private float timer_jump = 0f;
void AI_JumpTime() {
timer_jump += Time.deltaTime * 1f;
if (timer_jump >= speed && IntersectFloor()) {
AI_Jump (10f, 3f);
if(!AI_PlayerDetected(player, distance))
transform.Rotate (new Vector3 (0, Random.Range (0, 360), 0));
timer_jump = 0f;
}
}
bool AI_PlayerDetected(Transform player, float minDistance) {
return (Vector3.Distance (player.position, transform.position) < minDistance);
}
void AI_MoveToPlayer() {
if (AI_PlayerDetected (player, distance)) {
transform.LookAt (player);
}
}
public void Update() {
AI_JumpTime ();
AI_MoveToPlayer ();
}
}