我无法使对象移动到点击点。:( 它在生成点生成并挂起。
唯一的错误是如果只写在子弹脚本(PoolsObject)中,它就找不到Rigitbody。如果你在 Attack 中寻找这个组件,没有错误。
这是子弹运动脚本。召唤一个物体到一个点并告诉游泳的地方(或者更确切地说,应该这么说,但没有)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attack : MonoBehaviour
{
// ОПИСАНИЕ ДВИЖЕНИЯ ПУЛЬ
public GameObject container, empty;
RaycastHit hit;
Rigidbody rb;
public int damage = 1;
private Vector3 direction;
private bool isTouched;
//У призванного объекта берём Риджитбоди (я знаю, что можно без этого, он не работает ни в каком случае).
private void Start()
{
rb = Call().GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
//Ищем тык.
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
Ray ray = GetComponent<Camera>().ScreenPointToRay(touch.position);
//Вычисляем путь призванного объекта.
if (Call() != null)
{
if (Physics.Raycast(Call().gameObject.transform.position, ray.direction, out hit, Mathf.Infinity))
{
Debug.Log(hit.point);
Debug.DrawRay(Call().transform.position, ray.direction);
if (touch.phase == TouchPhase.Began && !isTouched)
{
Physics.SyncTransforms();
isTouched = true;
Invoke(nameof(Call), 0.1f);
direction = ray.direction - Call().transform.position;
Call().gameObject.transform.GetComponent<PoolsObject>().Movement(direction, rb);
isTouched = false;
}
}
}
}
}
//Просто призыв пули из пула.
private PoolsObject Call()
{
PoolsObject whizbang = container.GetComponent<Pool>().GetFreeElement(empty.transform.position);
return whizbang;
}
}
代码在弹丸本身上。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(Rigidbody))]
public class PoolsObject : MonoBehaviour
{
public int speed = 10;
//Возвращение в пул.
public void Return ()
{
gameObject.SetActive(false);
}
private void Update()
{
if (gameObject.activeInHierarchy)
{
Invoke(nameof(Return), 5f);
}
}
//Движение пули.
public void Movement (Vector3 direction, Rigidbody rb)
{
rb.velocity = direction * speed * Time.deltaTime;
}
}
池代码(以防万一)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pool : MonoBehaviour
{
private List<PoolsObject> bullets;
public PoolsObject bullet;
public int bulletPool;
// Start is called before the first frame update
void Awake()
{
bullets = new List<PoolsObject>();
InstantiateBullet();
}
private void InstantiateBullet()
{
for (int i = 0; i < bulletPool; i++)
{
CreateBullet(false);
}
}
private PoolsObject CreateBullet(bool isActiveByDefault = false)
{
var creation = Instantiate(bullet, gameObject.transform);
bullets.Add(creation);
creation.gameObject.SetActive(isActiveByDefault);
return creation;
}
public bool TryGetBullet(out PoolsObject poolsObject)
{
foreach (var bullet in bullets)
{
if (!bullet.gameObject.activeInHierarchy)
{
poolsObject = bullet;
bullet.gameObject.SetActive(true);
return true;
}
}
poolsObject = null;
return false;
}
public PoolsObject GetFreeElement()
{
if (TryGetBullet(out var poolsObject))
{
return poolsObject;
}
else return CreateBullet(true);
}
public PoolsObject GetFreeElement(Vector3 position)
{
if (TryGetBullet(out var poolsObject))
{
poolsObject.transform.position = position;
return poolsObject;
}
else return CreateBullet(true);
}
}
一般来说,我将 MovePosition 更改为 AddForce,使 AddForce 沿 Raycast 矢量(从相机到点击点)施加力。但即便如此,AddForce 会在各个方向产生噪音,所以在刚体中的弹丸中,我将 Drag 值增加到了 10。
哦,老实说,我这样做是为了从您的手指触摸屏幕的位置(即从 Canvas)进行拍摄。