Tôi có một hình bán nguyệt như đối tượng trò chơi mà tôi đã tạo bằng cách đặt hai cung trong một đối tượng trò chơi trống (SCircle) và xoay 15 ° (trái arc) và -15 ° (đối với hình cung bên phải) như hình dưới đây.Làm thế nào để xoay đối tượng con trong khi xoay đối tượng con đến một góc nhất định bằng coroutines
SCircle
có một enum Orientation
với hai giá trị Left
(quay SCircle đến 45 °) và Right
(quay SCircle
tới -45 °) như đã thấy trong hình dưới đây.
tôi sử dụng coroutine sau để di chuyển SCircle
giữa định hướng.
IEnumerator RotateLeftOrRight(Vector3 byAngles, float inTime)
{
Quaternion fromAngle = gameObject.transform.rotation ;
Quaternion toAngle = Quaternion.Euler (transform.eulerAngles);
if (circOrientation == Orientation.Left) {
toAngle = Quaternion.Euler (gameObject.transform.eulerAngles - byAngles);
circOrientation = Orientation.Right;
}
else if (circOrientation == Orientation.Right) {
toAngle = Quaternion.Euler (gameObject.transform.eulerAngles + byAngles);
circOrientation = Orientation.Left;
}
for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime)
{
gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ;
yield return null ;
}
gameObject.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1);
}
Tôi cũng sử dụng một coroutine rất giống với di chuyển vòng cung cá nhân bằng 30 ° (theo hướng ngược nhau) từ nói, Định hướng Left
, như bên dưới trong coroutine và hình ảnh:
IEnumerator RotateArc(GameObject arcGO, Vector3 byAngles, float inTime)
{
Quaternion fromAngle = arcGO.transform.rotation ;
Quaternion toAngle = Quaternion.Euler (arcGO.transform.eulerAngles);
if (rightArc.arcOrientation == Arc.Orientation.Down) {
toAngle = Quaternion.Euler (arcGO.transform.eulerAngles + byAngles);
rightArc.arcOrientation = Arc.Orientation.Up;
}
else if (rightArc.arcOrientation == Arc.Orientation.Down) {
toAngle = Quaternion.Euler (arcGO.transform.eulerAngles - byAngles);
rightArc.arcOrientation = Arc.Orientation.Up;
}
for(float t = 0f ; t <= 1f ; t += Time.deltaTime/inTime)
{
arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, t) ;
yield return null ;
}
arcGO.transform.rotation = Quaternion.Lerp(fromAngle, toAngle, 1);
}
Kể từ khi SCircle
Coroutine được kích hoạt bằng cách nhấp chuột, tôi có trường hợp cá thể vòng cung coroutine được chạy và trước khi hoàn thành phụ huynh SCircle
coroutine là cũng chạy. Trong trường hợp này, vòng cung sẽ chuyển động từ Left
sang A, không phải là hành vi tôi cần. Tôi muốn hành vi của họ kết thúc tại B khi di chuyển từ Left
. Tương tự như vậy, từ B, khi SCircle
coroutine được chạy trong khi corcsine vòng cung đang được tiến hành, hướng quay sẽ trở về Left
.
Xin lưu ý rằng mũi tên màu xanh biểu thị chuyển động của Arc bên trái, màu đỏ thể hiện Arc bên phải và màu đen biểu thị chuyển động của SCircle
- đối tượng mẹ.
Chỉ cần chắc chắn, bạn muốn di chuyển hai cung này cùng một lúc nhưng theo hướng khác nhau và bạn cũng muốn chuyển động kết thúc tại cùng một thời điểm? Nếu có, đối tượng nào là cha mẹ của người khác? – Programmer
@Programmer 'SCircle' là đối tượng cha, được tạo từ một đối tượng trống chứa cả vòng cung trái và phải. Tôi sẽ không muốn chuyển động kết thúc cùng lúc bởi vì vòng quay coroutine của vòng cung con bắt đầu trước khi coroutine quay của bố mẹ 'SCircle'. Do đó vòng xoay vòng cung của con sẽ kết thúc trước cha mẹ. Chỉ cần rằng sẽ có một điểm trong thời gian khi cả hai coroutines đang chạy đồng thời. Nói chung, mỗi coroutine nên cho thời gian của nó. – Bane
vui lòng chỉ cho chúng tôi mã để quay vòng cung 30 độ. Bạn có đặt vòng quay vòng cung thay vì xoay vòng cục bộ không? – lockstock