basicenemy
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BasicEnemy : MonoBehaviour
{
public Transform target;
public float speed = 3f;
public float attack1Range = 1f;
public int attack1Damage = 1;
public float timeBetweenAttacks;
// Use this for initialization
void Start()
{
Rest();
}
// Update is called once per frame
void Update()
{
}
public void MoveToPlayer()
{
//rotate to look at player
transform.LookAt(target.position);
transform.Rotate(new Vector3(0, -90, 0), Space.Self);
//move towards player
if (Vector3.Distance(transform.position, target.position) > attack1Range)
{
transform.Translate(new Vector3(speed * Time.deltaTime, 0, 0));
}
}
public void Rest()
{
}
}
Enementerritory
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyTerritory : MonoBehaviour
{
public BoxCollider territory;
GameObject player;
bool playerInTerritory;
public GameObject enemy;
BasicEnemy basicenemy;
// Use this for initialization
void Start()
{
player = GameObject.FindGameObjectWithTag("Player");
basicenemy = enemy.GetComponent<BasicEnemy>();
playerInTerritory = false;
}
// Update is called once per frame
void Update()
{
if (playerInTerritory)
{
basicenemy.MoveToPlayer();
}
if (playerInTerritory)
{
basicenemy.Rest();
}
}
void OnTriggerEnter(Collider other)
{
if (other.gameObject == player)
{
playerInTerritory = true;
}
}
void OnTriggerExit(Collider other)
{
if (other.gameObject == player)
{
playerInTerritory = false;
}
}
}
欢迎任何反馈,我试图让我添加到游戏中的敌人,以朝着比赛朝上,仿佛要依恋并跟随我可以完成这项运动,我将让他们在玩耍时拍摄。目前,我添加的所有新敌人都在圆圈中非常快地旋转。我没有语法错误。
更新功能中肯定有一些可疑的东西,因为您要分配(=
),而不是在条件下检查平等(==
)。
您不是说playerInTerritory == true
?
void Update()
{
if (playerInTerritory)
{
basicenemy.MoveToPlayer();
}
else
{
basicenemy.Rest();
}
}
如果这无济于事,请在触发/退出函数中添加一些Debug.Log
语句,以查看它们何时被调用。
编辑
好吧,我看着旋转。如果您希望敌人跟随玩家直到攻击范围内,则既有错误的旋转又错误的翻译。
旋转
// Rotate to look at player
transform.LookAt(target.position);
transform.Rotate(new Vector3(0, -90, 0), Space.Self);
这样做的是,它使敌人转向球员(您想要的),第二行使敌人旋转(每帧90°逆时针)。如果您不希望敌人旋转,则不需要线路。只需保持"查看"功能。
翻译
翻译问题是您朝着 X 轴的方向移动 - 这不是玩家的方向。您应该先计算方向向量并沿其转换。
它的要旨总是:
// normalized, so the vector affects only direction, not speed
Vector3 direction = (FROM.position - TO.position).normalized;
所以,那里:
Vector3 enemyToTargetDirection = (target.position - transform.position).normalized;
enemyToTargetDirection.y = 0; // stay in the same height
transform.Translate(enemyToTargetDirection * speed * Time.deltaTime);
您可以这样做,但是当敌人逐渐向您旋转时,我认为它看起来更好,而不仅仅是朝您的方向"抢购"。在这种情况下,结果功能看起来像这样:
public void MoveToPlayer()
{
Vector3 upwardsAxis = Vector3.up;
float distanceToPlayer = Vector3.Distance(transform.position, target.position);
if (distanceToPlayer > attack1Range)
{
float step = Time.deltaTime * speed;
Vector3 lookDirection = target.position - transform.position;
if (lookDirection != Vector3.zero) // Prevents rotation errors
{
// Rotate over time
Quaternion lookRotation = Quaternion.LookRotation(lookDirection, upwardsAxis);
transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, step * 2);
}
transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}
}
哦,顺便说一句,对于运动/旋转/物理学,您应该使用FixedUpdate()
而不是常规的Update()
(它会使运动更流利),并且不要保持'awake','start','start','如果它们是空白的"更新"方法,因为它会影响性能(稍微)。